crypticorn 2.5.3__py3-none-any.whl → 2.7.0__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.
Files changed (31) hide show
  1. crypticorn/auth/client/__init__.py +9 -0
  2. crypticorn/auth/client/api/auth_api.py +8 -5
  3. crypticorn/auth/client/api/user_api.py +247 -0
  4. crypticorn/auth/client/models/__init__.py +9 -0
  5. crypticorn/auth/client/models/create_api_key_request.py +2 -1
  6. crypticorn/auth/client/models/get_api_keys200_response_inner.py +2 -1
  7. crypticorn/auth/client/models/user_by_username200_response.py +91 -0
  8. crypticorn/auth/client/models/verify200_response.py +14 -1
  9. crypticorn/auth/client/models/verify_email200_response_auth_auth.py +14 -1
  10. crypticorn/auth/client/models/whoami200_response.py +6 -1
  11. crypticorn/common/__init__.py +1 -0
  12. crypticorn/common/auth.py +13 -9
  13. crypticorn/common/errors.py +320 -88
  14. crypticorn/common/exceptions.py +38 -4
  15. crypticorn/common/pagination.py +49 -0
  16. crypticorn/common/scopes.py +24 -5
  17. crypticorn/hive/client/__init__.py +2 -0
  18. crypticorn/hive/client/api/data_api.py +15 -12
  19. crypticorn/hive/client/api/models_api.py +343 -56
  20. crypticorn/hive/client/models/__init__.py +2 -0
  21. crypticorn/hive/client/models/data_info.py +44 -12
  22. crypticorn/hive/client/models/data_version_info.py +89 -0
  23. crypticorn/hive/client/models/model.py +2 -3
  24. crypticorn/hive/client/models/target_info.py +94 -0
  25. crypticorn/hive/main.py +43 -2
  26. crypticorn/hive/utils.py +65 -0
  27. {crypticorn-2.5.3.dist-info → crypticorn-2.7.0.dist-info}/METADATA +2 -2
  28. {crypticorn-2.5.3.dist-info → crypticorn-2.7.0.dist-info}/RECORD +31 -26
  29. {crypticorn-2.5.3.dist-info → crypticorn-2.7.0.dist-info}/WHEEL +1 -1
  30. {crypticorn-2.5.3.dist-info → crypticorn-2.7.0.dist-info}/entry_points.txt +0 -0
  31. {crypticorn-2.5.3.dist-info → crypticorn-2.7.0.dist-info}/top_level.txt +0 -0
@@ -17,15 +17,15 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, StrictFloat, StrictInt
21
- from typing import Any, ClassVar, Dict, List, Union
20
+ from pydantic import BaseModel, ConfigDict
21
+ from typing import Any, ClassVar, Dict, List
22
22
  from crypticorn.hive.client.models.coins import Coins
23
23
  from crypticorn.hive.client.models.data_value_value_value_inner import (
24
24
  DataValueValueValueInner,
25
25
  )
26
- from crypticorn.hive.client.models.data_version import DataVersion
26
+ from crypticorn.hive.client.models.data_version_info import DataVersionInfo
27
27
  from crypticorn.hive.client.models.feature_size import FeatureSize
28
- from crypticorn.hive.client.models.target_type import TargetType
28
+ from crypticorn.hive.client.models.target_info import TargetInfo
29
29
  from typing import Optional, Set
30
30
  from typing_extensions import Self
31
31
 
@@ -38,16 +38,16 @@ class DataInfo(BaseModel):
38
38
  data: Dict[str, Dict[str, Dict[str, List[DataValueValueValueInner]]]]
39
39
  coins: List[Coins]
40
40
  feature_sizes: List[FeatureSize]
41
- targets: Dict[str, TargetType]
42
- versions: Dict[str, Union[StrictFloat, StrictInt]]
43
- latest_version: DataVersion
41
+ targets: List[TargetInfo]
42
+ all_versions: List[DataVersionInfo]
43
+ available_versions: List[DataVersionInfo]
44
44
  __properties: ClassVar[List[str]] = [
45
45
  "data",
46
46
  "coins",
47
47
  "feature_sizes",
48
48
  "targets",
49
- "versions",
50
- "latest_version",
49
+ "all_versions",
50
+ "available_versions",
51
51
  ]
52
52
 
53
53
  model_config = ConfigDict(
@@ -87,6 +87,27 @@ class DataInfo(BaseModel):
87
87
  exclude=excluded_fields,
88
88
  exclude_none=True,
89
89
  )
90
+ # override the default output from pydantic by calling `to_dict()` of each item in targets (list)
91
+ _items = []
92
+ if self.targets:
93
+ for _item_targets in self.targets:
94
+ if _item_targets:
95
+ _items.append(_item_targets.to_dict())
96
+ _dict["targets"] = _items
97
+ # override the default output from pydantic by calling `to_dict()` of each item in all_versions (list)
98
+ _items = []
99
+ if self.all_versions:
100
+ for _item_all_versions in self.all_versions:
101
+ if _item_all_versions:
102
+ _items.append(_item_all_versions.to_dict())
103
+ _dict["all_versions"] = _items
104
+ # override the default output from pydantic by calling `to_dict()` of each item in available_versions (list)
105
+ _items = []
106
+ if self.available_versions:
107
+ for _item_available_versions in self.available_versions:
108
+ if _item_available_versions:
109
+ _items.append(_item_available_versions.to_dict())
110
+ _dict["available_versions"] = _items
90
111
  return _dict
91
112
 
92
113
  @classmethod
@@ -104,12 +125,23 @@ class DataInfo(BaseModel):
104
125
  "coins": obj.get("coins"),
105
126
  "feature_sizes": obj.get("feature_sizes"),
106
127
  "targets": (
107
- dict((_k, _v) for _k, _v in obj.get("targets").items())
128
+ [TargetInfo.from_dict(_item) for _item in obj["targets"]]
108
129
  if obj.get("targets") is not None
109
130
  else None
110
131
  ),
111
- "versions": obj.get("versions"),
112
- "latest_version": obj.get("latest_version"),
132
+ "all_versions": (
133
+ [DataVersionInfo.from_dict(_item) for _item in obj["all_versions"]]
134
+ if obj.get("all_versions") is not None
135
+ else None
136
+ ),
137
+ "available_versions": (
138
+ [
139
+ DataVersionInfo.from_dict(_item)
140
+ for _item in obj["available_versions"]
141
+ ]
142
+ if obj.get("available_versions") is not None
143
+ else None
144
+ ),
113
145
  }
114
146
  )
115
147
  return _obj
@@ -0,0 +1,89 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Hive AI API
5
+
6
+ API for Hive AI model training and evaluation
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, StrictInt
21
+ from typing import Any, ClassVar, Dict, List
22
+ from crypticorn.hive.client.models.data_version import DataVersion
23
+ from typing import Optional, Set
24
+ from typing_extensions import Self
25
+
26
+
27
+ class DataVersionInfo(BaseModel):
28
+ """
29
+ DataVersionInfo
30
+ """ # noqa: E501
31
+
32
+ version: DataVersion = Field(description="Data version")
33
+ release_date: StrictInt = Field(
34
+ description="Release date of the data version in unix timestamp"
35
+ )
36
+ __properties: ClassVar[List[str]] = ["version", "release_date"]
37
+
38
+ model_config = ConfigDict(
39
+ populate_by_name=True,
40
+ validate_assignment=True,
41
+ protected_namespaces=(),
42
+ )
43
+
44
+ def to_str(self) -> str:
45
+ """Returns the string representation of the model using alias"""
46
+ return pprint.pformat(self.model_dump(by_alias=True))
47
+
48
+ def to_json(self) -> str:
49
+ """Returns the JSON representation of the model using alias"""
50
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
51
+ return json.dumps(self.to_dict())
52
+
53
+ @classmethod
54
+ def from_json(cls, json_str: str) -> Optional[Self]:
55
+ """Create an instance of DataVersionInfo from a JSON string"""
56
+ return cls.from_dict(json.loads(json_str))
57
+
58
+ def to_dict(self) -> Dict[str, Any]:
59
+ """Return the dictionary representation of the model using alias.
60
+
61
+ This has the following differences from calling pydantic's
62
+ `self.model_dump(by_alias=True)`:
63
+
64
+ * `None` is only added to the output dict for nullable fields that
65
+ were set at model initialization. Other fields with value `None`
66
+ are ignored.
67
+ """
68
+ excluded_fields: Set[str] = set([])
69
+
70
+ _dict = self.model_dump(
71
+ by_alias=True,
72
+ exclude=excluded_fields,
73
+ exclude_none=True,
74
+ )
75
+ return _dict
76
+
77
+ @classmethod
78
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
79
+ """Create an instance of DataVersionInfo from a dict"""
80
+ if obj is None:
81
+ return None
82
+
83
+ if not isinstance(obj, dict):
84
+ return cls.model_validate(obj)
85
+
86
+ _obj = cls.model_validate(
87
+ {"version": obj.get("version"), "release_date": obj.get("release_date")}
88
+ )
89
+ return _obj
@@ -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, Field, StrictInt, StrictStr
22
21
  from typing import Any, ClassVar, Dict, List
23
22
  from crypticorn.hive.client.models.coins import Coins
@@ -42,8 +41,8 @@ class Model(BaseModel):
42
41
  target_type: TargetType = Field(description="Target type")
43
42
  evaluations: List[Evaluation] = Field(description="Model evaluations")
44
43
  user_id: StrictStr = Field(description="Developer user ID")
45
- created_at: datetime = Field(description="Model creation timestamp")
46
- updated_at: datetime = Field(description="Model update timestamp")
44
+ created_at: StrictInt = Field(description="Model creation unix timestamp")
45
+ updated_at: StrictInt = Field(description="Model update unix timestamp")
47
46
  __properties: ClassVar[List[str]] = [
48
47
  "model_id",
49
48
  "name",
@@ -0,0 +1,94 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Hive AI API
5
+
6
+ API for Hive AI model training and evaluation
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
21
+ from typing import Any, ClassVar, Dict, List
22
+ from crypticorn.hive.client.models.data_version import DataVersion
23
+ from crypticorn.hive.client.models.target import Target
24
+ from crypticorn.hive.client.models.target_type import TargetType
25
+ from typing import Optional, Set
26
+ from typing_extensions import Self
27
+
28
+
29
+ class TargetInfo(BaseModel):
30
+ """
31
+ TargetInfo
32
+ """ # noqa: E501
33
+
34
+ name: Target = Field(description="Target name")
35
+ type: TargetType = Field(description="Target type")
36
+ version: DataVersion = Field(description="Data version")
37
+ __properties: ClassVar[List[str]] = ["name", "type", "version"]
38
+
39
+ model_config = ConfigDict(
40
+ populate_by_name=True,
41
+ validate_assignment=True,
42
+ protected_namespaces=(),
43
+ )
44
+
45
+ def to_str(self) -> str:
46
+ """Returns the string representation of the model using alias"""
47
+ return pprint.pformat(self.model_dump(by_alias=True))
48
+
49
+ def to_json(self) -> str:
50
+ """Returns the JSON representation of the model using alias"""
51
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
52
+ return json.dumps(self.to_dict())
53
+
54
+ @classmethod
55
+ def from_json(cls, json_str: str) -> Optional[Self]:
56
+ """Create an instance of TargetInfo from a JSON string"""
57
+ return cls.from_dict(json.loads(json_str))
58
+
59
+ def to_dict(self) -> Dict[str, Any]:
60
+ """Return the dictionary representation of the model using alias.
61
+
62
+ This has the following differences from calling pydantic's
63
+ `self.model_dump(by_alias=True)`:
64
+
65
+ * `None` is only added to the output dict for nullable fields that
66
+ were set at model initialization. Other fields with value `None`
67
+ are ignored.
68
+ """
69
+ excluded_fields: Set[str] = set([])
70
+
71
+ _dict = self.model_dump(
72
+ by_alias=True,
73
+ exclude=excluded_fields,
74
+ exclude_none=True,
75
+ )
76
+ return _dict
77
+
78
+ @classmethod
79
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
80
+ """Create an instance of TargetInfo from a dict"""
81
+ if obj is None:
82
+ return None
83
+
84
+ if not isinstance(obj, dict):
85
+ return cls.model_validate(obj)
86
+
87
+ _obj = cls.model_validate(
88
+ {
89
+ "name": obj.get("name"),
90
+ "type": obj.get("type"),
91
+ "version": obj.get("version"),
92
+ }
93
+ )
94
+ return _obj
crypticorn/hive/main.py CHANGED
@@ -1,3 +1,6 @@
1
+ import asyncio
2
+ from pathlib import Path
3
+ import os
1
4
  from crypticorn.hive import (
2
5
  ApiClient,
3
6
  Configuration,
@@ -6,7 +9,45 @@ from crypticorn.hive import (
6
9
  StatusApi,
7
10
  Configuration,
8
11
  )
9
- from crypticorn.common import apikey_header as aph
12
+ from crypticorn.hive.utils import download_file
13
+ import logging
14
+
15
+
16
+ class DataApiWrapper(DataApi):
17
+ """
18
+ A wrapper for the DataApi class.
19
+ """
20
+
21
+ async def download_data(self, folder: Path = "data", *args, **kwargs) -> list[Path]:
22
+ """
23
+ Download data for model training. All three files (y_train, x_test, x_train) are downloaded and saved under e.g. FOLDER/v1/coin_1/*.feather.
24
+ The folder will be created if it doesn't exist.
25
+
26
+ :param model_id: Model ID (required) (type: int)
27
+ :param version: Data version. Default is the latest public version. (optional) (type: DataVersion)
28
+ :param feature_size: The number of features in the data. Default is LARGE. (optional) (type: FeatureSize)
29
+ :return: A list of paths to the downloaded files.
30
+ """
31
+ response = await super().download_data(*args, **kwargs)
32
+ base_path = f"{folder}/v{response.version.value}/coin_{response.coin.value}/"
33
+ os.makedirs(base_path, exist_ok=True)
34
+
35
+ return await asyncio.gather(
36
+ *[
37
+ download_file(
38
+ url=response.links.y_train,
39
+ dest_path=base_path + "y_train_" + response.target + ".feather",
40
+ ),
41
+ download_file(
42
+ url=response.links.x_test,
43
+ dest_path=base_path + "x_test_" + response.feature_size + ".feather",
44
+ ),
45
+ download_file(
46
+ url=response.links.x_train,
47
+ dest_path=base_path + "x_train_" + response.feature_size + ".feather",
48
+ ),
49
+ ]
50
+ )
10
51
 
11
52
 
12
53
  class HiveClient:
@@ -24,5 +65,5 @@ class HiveClient:
24
65
  self.base_client = ApiClient(configuration=self.config)
25
66
  # Instantiate all the endpoint clients
26
67
  self.models = ModelsApi(self.base_client)
27
- self.data = DataApi(self.base_client)
68
+ self.data = DataApiWrapper(self.base_client)
28
69
  self.status = StatusApi(self.base_client)
@@ -0,0 +1,65 @@
1
+ import requests
2
+ import os
3
+ import tqdm
4
+ import logging
5
+
6
+ logger = logging.getLogger(__name__)
7
+ logger.setLevel(logging.INFO)
8
+
9
+
10
+ async def download_file(url: str, dest_path: str, show_progress_bars: bool = True) -> str:
11
+ """downloads a file and shows a progress bar. allow resuming a download"""
12
+ file_size = 0
13
+ req = requests.get(url, stream=True, timeout=600)
14
+ req.raise_for_status()
15
+
16
+ total_size = int(req.headers.get("content-length", 0))
17
+ temp_path = dest_path + ".temp"
18
+
19
+ if os.path.exists(dest_path):
20
+ logger.info(f" file already exists: {dest_path}")
21
+ file_size = os.stat(dest_path).st_size
22
+ if file_size == total_size:
23
+ return dest_path
24
+
25
+ if os.path.exists(temp_path):
26
+ file_size = os.stat(temp_path).st_size
27
+
28
+ if file_size < total_size:
29
+ # Download incomplete
30
+ logger.info(f" resuming download")
31
+ resume_header = {"Range": f"bytes={file_size}-"}
32
+ req = requests.get(
33
+ url,
34
+ headers=resume_header,
35
+ stream=True,
36
+ verify=False,
37
+ allow_redirects=True,
38
+ timeout=600,
39
+ )
40
+ else:
41
+ # Error, delete file and restart download
42
+ logger.error(f" deleting file {dest_path} and restarting")
43
+ os.remove(temp_path)
44
+ file_size = 0
45
+ else:
46
+ # File does not exist, starting download
47
+ logger.info(f" starting download")
48
+
49
+ # write dataset to file and show progress bar
50
+ pbar = tqdm.tqdm(
51
+ total=total_size,
52
+ unit="B",
53
+ unit_scale=True,
54
+ desc=dest_path,
55
+ disable=not show_progress_bars,
56
+ )
57
+ # Update progress bar to reflect how much of the file is already downloaded
58
+ pbar.update(file_size)
59
+ with open(temp_path, "ab") as dest_file:
60
+ for chunk in req.iter_content(1024):
61
+ dest_file.write(chunk)
62
+ pbar.update(1024)
63
+ # move temp file to target destination
64
+ os.replace(temp_path, dest_path)
65
+ return dest_path
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crypticorn
3
- Version: 2.5.3
4
- Summary: Maximise Your Crypto Trading Profits with AI Predictions
3
+ Version: 2.7.0
4
+ Summary: Maximise Your Crypto Trading Profits with Machine Learning
5
5
  Author-email: Crypticorn <timon@crypticorn.com>
6
6
  Project-URL: Homepage, https://crypticorn.com
7
7
  Keywords: machine learning,data science,crypto,modelling
@@ -2,7 +2,7 @@ crypticorn/__init__.py,sha256=TL41V09dmtbd2ee07wmOuG9KJJpyvLMPJi5DEd9bDyU,129
2
2
  crypticorn/client.py,sha256=jMdF4mZuqB8YMZZOwJkTcvpHluGqw6Q-taSF6vQS5WM,3912
3
3
  crypticorn/auth/__init__.py,sha256=JAl1tBLK9pYLr_-YKaj581c-c94PWLoqnatTIVAVvMM,81
4
4
  crypticorn/auth/main.py,sha256=j8eRGN2gUWyeOCnWnUPe3mCAfaidGnOMnZRiSQy-yzM,720
5
- crypticorn/auth/client/__init__.py,sha256=Xda54fgvIunmwHy8CeOI_L3LJxQJ6qcoN3HQ24zIPxo,4970
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
8
  crypticorn/auth/client/configuration.py,sha256=eBiet9rc3ok09IltEbCX14DhQGEOc0_sPHrRLKNSmCo,18034
@@ -11,20 +11,20 @@ crypticorn/auth/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
11
11
  crypticorn/auth/client/rest.py,sha256=7ykLyiCyjtTiC1F-9JfrD79vaA831O_irNDmaRArnGg,6994
12
12
  crypticorn/auth/client/api/__init__.py,sha256=c-MlPvmOXSsk_ragrcUe8WkOuCPTTpJ8maSp2sER0EU,339
13
13
  crypticorn/auth/client/api/admin_api.py,sha256=SmChBoU6emc2q-AqH2yRAWFCsOKn2Uis2H9Z-_TGHwg,21215
14
- crypticorn/auth/client/api/auth_api.py,sha256=InTxFQcjE0KWHJM_fT_4dwts5abiPUNE68csIcCSGmE,124169
14
+ crypticorn/auth/client/api/auth_api.py,sha256=HsCzlkjFJjdJwNZ-toQhLaQnpH-o4fPJaf6xsO2ICiw,124272
15
15
  crypticorn/auth/client/api/service_api.py,sha256=rAnJOot2xLgKY9BAaEv_KtsSUgHXbOD58jypyry7Hkg,12403
16
- crypticorn/auth/client/api/user_api.py,sha256=sdjnFdTnZj7fEjH9BRvE6HKnq9z7fBqXYEmEs1wai-0,103473
16
+ crypticorn/auth/client/api/user_api.py,sha256=1GdN2cfzY52SK_Qn_oGnzrAJVjI0capYuo-bHKOylE4,113273
17
17
  crypticorn/auth/client/api/wallet_api.py,sha256=_WRT6b5E1dEI8nd2XXjFsFFrbjbO9OdFrOooSBb6nGs,68907
18
- crypticorn/auth/client/models/__init__.py,sha256=8jrVj3WzG0EVTZCcSV7A7gGdK3CQa3YGJPoTh946HlI,4062
18
+ crypticorn/auth/client/models/__init__.py,sha256=Y6t08mCcqpV7B1OIUZ5Vb5sgtr0s9sGy-0bhSh0DEgM,4383
19
19
  crypticorn/auth/client/models/add_wallet200_response.py,sha256=orw50N1bfr7qg9N8e73VmsvulFvBN0-8PMaR0ze79ks,2539
20
20
  crypticorn/auth/client/models/add_wallet_request.py,sha256=lap0RG_tbW6wq2RHlgUNugI4s0lQq50OO0tXOvK637I,3184
21
21
  crypticorn/auth/client/models/authorize_user200_response.py,sha256=fstTaffARzCe7woPYBuDqxzn-YYl1K1q4yQObGaXpq8,3361
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=tCy0T5zVzai9__v9wv8zjGirc3jOxRS6zYtuA-uUaR4,5423
25
+ crypticorn/auth/client/models/create_api_key_request.py,sha256=V98HWwlRT2AYo96D7W5L4P-MFrOVi62zvHsFY3CVl8M,5479
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=KcE5mVp4kTosKZHFTLbGUs6iFyoEjPuLY984GlO1UnM,5811
27
+ crypticorn/auth/client/models/get_api_keys200_response_inner.py,sha256=G5YxZyrm06NrhfdsS-JA2P97doso2jFscElmGR7teXs,5867
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
@@ -44,35 +44,38 @@ crypticorn/auth/client/models/rotate_tokens200_response.py,sha256=LhSgnQfdCqtxmp
44
44
  crypticorn/auth/client/models/token_info200_response.py,sha256=KFwn4oVmBR5JbwIGk0VXu0Vh9JCTRbBBmpqRXrjpWb0,2952
45
45
  crypticorn/auth/client/models/unlink_wallet_request.py,sha256=dzYVVANju72DrzQSuKqGHpBv9V4Yv1wl7S42YqzFL98,2395
46
46
  crypticorn/auth/client/models/update_user_request.py,sha256=eHXaMbXbM5YofcN5cl0fl7C-FBGqOpnS7ZzhEOoR7Ig,2826
47
+ crypticorn/auth/client/models/user_by_username200_response.py,sha256=JZDEm8P_bnuR6kPFEBTGpisXhEvNYjV8nTibDLXCBKs,2718
47
48
  crypticorn/auth/client/models/user_reset_password_request.py,sha256=9fkUUIpLyvk3YeWcvWL4DWidzenH1mss3L54J3kThuk,2638
48
49
  crypticorn/auth/client/models/user_set_password_request.py,sha256=OSaIKJ_4EcwXvV-chXbRypD8dujMt08slP_CxPWEtiM,2640
49
- crypticorn/auth/client/models/verify200_response.py,sha256=VO2faCFHFfcxCF6RWitV9JgL0ON1D6-xA8_q_5B1vD4,3605
50
+ crypticorn/auth/client/models/verify200_response.py,sha256=qNZ2ytBJ6ShX-EEB6h6CbwWbgVW8cTj7f1NKKgjoZYo,3822
50
51
  crypticorn/auth/client/models/verify_email200_response.py,sha256=NyhA3kn7lhYsjujdtHdZEjeYTQ0BuVu277twqnYTN5A,3345
51
52
  crypticorn/auth/client/models/verify_email200_response_auth.py,sha256=BmH0ZD7zrlZ6uwb1aBjQXCMnFcWtByTtHrFRBAVcUew,3227
52
- crypticorn/auth/client/models/verify_email200_response_auth_auth.py,sha256=1QnPuAjUc4LhmFEMkveQFFa3vq4B1V3XpkR1G4R-8Wo,3657
53
+ crypticorn/auth/client/models/verify_email200_response_auth_auth.py,sha256=BNfpNWk0kLFc3oUjCIEv-S3R8J20dJbGCsniouK_c4U,3874
53
54
  crypticorn/auth/client/models/verify_email_request.py,sha256=W_X14qdTADduVwY4wxSNBPrHHDuiJinD0-sjyP1fkhg,2444
54
55
  crypticorn/auth/client/models/verify_wallet_request.py,sha256=gFKkFXi6b45aUfyklFeHKNJVLxYXE3wR3PvF3JVI4Po,2671
55
56
  crypticorn/auth/client/models/wallet_verified200_response.py,sha256=IXhtaD0CC6Jp9ZG6sgyRg-beIzrhFDuF_bQYOjNMdY0,2445
56
- crypticorn/auth/client/models/whoami200_response.py,sha256=sFzrMXBn6npQwRsV3TJ_hDlFVbEolYJBaJDnrK5zvlM,2954
57
+ crypticorn/auth/client/models/whoami200_response.py,sha256=-Kj3fB4lgNaa8v_LTertjxXahBYtTpTIXkBha9MhA1o,3199
57
58
  crypticorn/cli/__init__.py,sha256=bgMmlpRThjYcxXJ1U3UmLE8ODVT5olmFY1u69VOjthQ,69
58
59
  crypticorn/cli/__main__.py,sha256=x9T4xS3U-qokGEzad7rTujmq4yjV5xcYSXgNsDFkvyo,253
59
60
  crypticorn/cli/init.py,sha256=xefvOCjXOiSUPWHFDDv7DWDC0Ggs1JKxk7KPCXyMZnU,3729
60
61
  crypticorn/cli/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
62
  crypticorn/cli/templates/auth.py,sha256=Q1TxlA7qzhjvrqp1xz1aV2vGnj3DKFNN-VSl3o0B-dI,983
62
- crypticorn/common/__init__.py,sha256=isHr_zq4HyI8hSrv2a44BT4EsQIZilxllfhHeTONNRo,421
63
- crypticorn/common/auth.py,sha256=NKT3qnoQF_UYvHW_XS7YywvKd5RbbLv3EcMKnARn7U0,8627
63
+ crypticorn/common/__init__.py,sha256=42ajAXlz0LDBb1AFyX8xvwpp1MB_YrvqutFDkLthUQM,464
64
+ crypticorn/common/auth.py,sha256=60SRXlW72VJO8rGzCiemWmzGu8tXDqWr0wt9EM6p8aI,8631
64
65
  crypticorn/common/decorators.py,sha256=pmnGYCIrLv59wZkDbvPyK9NJmgPJWW74LXTdIWSjOkY,1063
65
66
  crypticorn/common/enums.py,sha256=RitDVqlG_HTe6tHT6bWusZNFCeYk1eQvJVH-7x3_Zlg,668
66
- crypticorn/common/errors.py,sha256=FgUpSsegzhkseEwKS2moIoWFKrvCWUllXX9bdSo482w,22145
67
- crypticorn/common/exceptions.py,sha256=svRxFsdeuEiIWPB7K4Nh1ouVTnROZXa_eWHnE7Gka0I,4455
67
+ crypticorn/common/errors.py,sha256=K1VSEKZro1I4cmi-sOhx24pTrvhbbD4RBRRqKodWpA8,27851
68
+ crypticorn/common/exceptions.py,sha256=Rrpk2ORou2F__cNUWmXs6tFZwIFBZppF4YapUSZLfOQ,5662
68
69
  crypticorn/common/mixins.py,sha256=LKPcNTR8uREeDGWTlWozNx7rS1mYdQVx1RllLhxIAsE,1640
69
- crypticorn/common/scopes.py,sha256=UZqXqy_AJFna-L_O01aCXzV9IksrW--AIjsEMAnUl9U,1849
70
+ crypticorn/common/pagination.py,sha256=c07jrMNrBaNTmgx4sppdP7ND4RNT7NBqBXWvofazIlE,2251
71
+ crypticorn/common/scopes.py,sha256=D1IPujWhRUHD9Xq_ln6_kQUC5Fh0Pam-JLSNNK7m9uk,2364
70
72
  crypticorn/common/status_router.py,sha256=s7LY3aNQPhtDUgNWHRszfCQMl0Uh13li_jR8jeeolnw,1139
71
73
  crypticorn/common/urls.py,sha256=3Gf1NU1XQYcOTjcdztG3bDAE98FVbgTK2QXzUe7tFVQ,878
72
74
  crypticorn/common/utils.py,sha256=Kz2-I96MKIGKM18PHQ77VbKHLMGUvZG_jjj7xpQed8k,2138
73
75
  crypticorn/hive/__init__.py,sha256=hRfTlEzEql4msytdUC_04vfaHzVKG5CGZle1M-9QFgY,81
74
- crypticorn/hive/main.py,sha256=WUgsjs9p9zZ5NgPuD54m1u8dLnM8yaYCYHF51AH2IaE,665
75
- crypticorn/hive/client/__init__.py,sha256=D0XGAY5mEs1xkwTwhsknol6Gjkufyt9ORRpuE2yfi6c,2190
76
+ crypticorn/hive/main.py,sha256=8-MKEE9zjxjSk4QMD-PcezD5MS-A1BzCFAmdgunJqyg,2308
77
+ crypticorn/hive/utils.py,sha256=nQe_GLb2Xk9EsuYpHASb_Sik5VyNXEHewCgT1LN4woo,2060
78
+ crypticorn/hive/client/__init__.py,sha256=BZ7MlUhK1x5j73WRPTPJFbTSELv9urdbpPonq04m6Aw,2331
76
79
  crypticorn/hive/client/api_client.py,sha256=fDFsACK7hxXw_sgt3ZJVH2RplEdUhR0YZd4tsZA9P5Q,26869
77
80
  crypticorn/hive/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
78
81
  crypticorn/hive/client/configuration.py,sha256=J4tZF5m71BMOFE1rfWzgrBWEPQ-DQ-FByFJiNZ81W48,19105
@@ -80,25 +83,27 @@ crypticorn/hive/client/exceptions.py,sha256=IKuM8sbMtr3T9z-fOuePTJmheUFahzmyZ8ia
80
83
  crypticorn/hive/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
84
  crypticorn/hive/client/rest.py,sha256=VhXkE7R3y1RD0QmbvIwmsk-LP_DmOei_zd9YiIXer28,6975
82
85
  crypticorn/hive/client/api/__init__.py,sha256=y0KYdyqWZTjlf6IKASYmLdUs9a2aiFMHrfQO_V_-ZUw,223
83
- crypticorn/hive/client/api/data_api.py,sha256=9WpN0R1eI6Bq7KfJwm7R_fJ0IYIDoBIehQiUG3sb4kE,22351
84
- crypticorn/hive/client/api/models_api.py,sha256=BKnx6xbEjk6ug05xGaQA6r8KHJHwHojz93VF36h8xLg,62293
86
+ crypticorn/hive/client/api/data_api.py,sha256=GJlH2Qs1KmWCc4nv7y5byyyFDiidLdooG-WvbBv-Z-4,22624
87
+ crypticorn/hive/client/api/models_api.py,sha256=61r9uObh1puEGJOXi_v-LmEP1xNqfbEo5spEYzlAA44,74136
85
88
  crypticorn/hive/client/api/status_api.py,sha256=3ZZ9e1duL9Oz8gWvQQMryUevuRY_ERMPpClW8gY2THE,28714
86
- crypticorn/hive/client/models/__init__.py,sha256=PmiAjoetM6MVwCWwqrX394IU3qoZItDG-57CtwmcOCc,1398
89
+ crypticorn/hive/client/models/__init__.py,sha256=C-SmdIMEQljgJaxgADRAgHQuknh0sCZiAELnHC4SuJI,1539
87
90
  crypticorn/hive/client/models/coins.py,sha256=9fTwC6_7mMS2dz4cUZoLYWloOpAjCr-KySGYrVZO_IE,795
88
91
  crypticorn/hive/client/models/data_download_response.py,sha256=ZipGpZW_BPmjLeHimiveacWc3R27afjA2c8R7xXAlAE,3425
89
- crypticorn/hive/client/models/data_info.py,sha256=2OCOe3yNwDyKLRusUwzaykvTQF7-Zflr1QW19B9R9kg,3549
92
+ crypticorn/hive/client/models/data_info.py,sha256=2moeH1k9b6-jot6HIzyduONTNWXFcB2ltW3U0sZd5nk,5068
90
93
  crypticorn/hive/client/models/data_value_value_value_inner.py,sha256=fMkZWwAwrdmTDjwD9PVNIh4WzZ_nFACD57B7OPKO4n4,4987
91
94
  crypticorn/hive/client/models/data_version.py,sha256=MMgH6JyFdcpAc6mzs4j13Gumd0vDTw3UEOsKFSOcsSg,668
95
+ crypticorn/hive/client/models/data_version_info.py,sha256=LdwEwSgGfOzjitxiPXZfEp7IDkMQJs_7SCftZI0-5TQ,2687
92
96
  crypticorn/hive/client/models/download_links.py,sha256=bmxzXwpGxlFwoOPPsKFtEGdotzP_04WHQvzuj2mtu-Q,2639
93
97
  crypticorn/hive/client/models/evaluation.py,sha256=WeLJA4tCS4W_CnGxRAgrxySWko3QPYzpxeVDuYyLPgM,2608
94
98
  crypticorn/hive/client/models/evaluation_response.py,sha256=iwE1G1_EOFga6Zztf1A8z6TNiNc_R06r2lKLHIr5_6A,2526
95
99
  crypticorn/hive/client/models/exception_detail.py,sha256=xLvJvILpIQl3Nl0LYtDPXsZcIouWIUB-0fqoUAaqiaU,3657
96
100
  crypticorn/hive/client/models/feature_size.py,sha256=4lICZHaNU9eLkHzcTaquajSrcOGlBBRFvEKySPp89bc,705
97
- crypticorn/hive/client/models/model.py,sha256=0CyvuMeNbaxY8QpPqCZo0jli0v9C6yAVnckBV2cSvys,4554
101
+ crypticorn/hive/client/models/model.py,sha256=xbyqGaaiql35T2-qGyG1kkLsnKJCEmzm1bBNvQDf4FI,4536
98
102
  crypticorn/hive/client/models/model_create.py,sha256=f6Ayw3KD39qw0qtvYF77K3huy7_Tmzv8pDyyQ_ooAG8,2828
99
103
  crypticorn/hive/client/models/model_status.py,sha256=-2H6CHw6jhJgv4VJgwr1sgN2NtT1m7LGCX7L8ULTxEQ,685
100
104
  crypticorn/hive/client/models/model_update.py,sha256=iO-VtYt0aRzj9z_GeIUK2OVNg9yvM01OUVfWyCA36fc,2413
101
105
  crypticorn/hive/client/models/target.py,sha256=eTDXDO4Vv1bB-cFrH7FuEeY7Eaf0YDIrQgba9TW7Y6s,697
106
+ crypticorn/hive/client/models/target_info.py,sha256=evxehW41BlLG2EUYb4ZZBKgF-0-3ZzHNSFWe_7qyjiQ,2841
102
107
  crypticorn/hive/client/models/target_type.py,sha256=rv9ub_0BM5DAR8jtGAZKbTO7RObEu-86kPT4dTS-OuM,672
103
108
  crypticorn/klines/__init__.py,sha256=9UUW013uZ5x4evz5zRUxbNid-6O9WAPPYvPZIHpAwms,87
104
109
  crypticorn/klines/main.py,sha256=uQ7Ds_pQZ68o3uvSUOd7J0NEyy9--88dKXhzzm0F9dI,2754
@@ -216,8 +221,8 @@ crypticorn/trade/client/models/strategy_model_input.py,sha256=ala19jARyfA5ysys5D
216
221
  crypticorn/trade/client/models/strategy_model_output.py,sha256=2o2lhbgUSTznowpMLEHF1Ex9TG9oRmzlCIb-gXqo7_s,5643
217
222
  crypticorn/trade/client/models/tpsl.py,sha256=C2KgTIZs-a8W4msdaXgBKJcwtA-o5wR4rBauRP-iQxU,4317
218
223
  crypticorn/trade/client/models/trading_action_type.py,sha256=pGq_TFLMPfYFizYP-xKgEC1ZF4U3lGdJYoGa_ZH2x-Q,769
219
- crypticorn-2.5.3.dist-info/METADATA,sha256=_59Ag8hzRsKPMM1-y7OBnmYLFV49aSk0mWm7Ru6rP_w,6247
220
- crypticorn-2.5.3.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
221
- crypticorn-2.5.3.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
222
- crypticorn-2.5.3.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
223
- crypticorn-2.5.3.dist-info/RECORD,,
224
+ crypticorn-2.7.0.dist-info/METADATA,sha256=WcIXa2urQyx79i-xY-v6Q6TicA9zaybXWNOcmg2euxo,6249
225
+ crypticorn-2.7.0.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
226
+ crypticorn-2.7.0.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
227
+ crypticorn-2.7.0.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
228
+ crypticorn-2.7.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5