code-loader 1.0.43__py3-none-any.whl → 1.0.43a1__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.
- code_loader/__init__.py +2 -0
- code_loader/experiment_api/__init__.py +0 -0
- code_loader/experiment_api/api.py +81 -0
- code_loader/experiment_api/cli_config_utils.py +41 -0
- code_loader/experiment_api/client.py +34 -0
- code_loader/experiment_api/epoch.py +63 -0
- code_loader/experiment_api/experiment.py +49 -0
- code_loader/experiment_api/experiment_context.py +10 -0
- code_loader/experiment_api/types.py +25 -0
- code_loader/experiment_api/utils.py +35 -0
- code_loader/experiment_api/workingspace_config_utils.py +27 -0
- {code_loader-1.0.43.dist-info → code_loader-1.0.43a1.dist-info}/METADATA +3 -1
- code_loader-1.0.43a1.dist-info/RECORD +28 -0
- code_loader-1.0.43.dist-info/RECORD +0 -18
- {code_loader-1.0.43.dist-info → code_loader-1.0.43a1.dist-info}/LICENSE +0 -0
- {code_loader-1.0.43.dist-info → code_loader-1.0.43a1.dist-info}/WHEEL +0 -0
code_loader/__init__.py
CHANGED
File without changes
|
@@ -0,0 +1,81 @@
|
|
1
|
+
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import Dict, List, Optional, Any
|
4
|
+
from code_loader.experiment_api.client import Client
|
5
|
+
from code_loader.experiment_api.types import ApiMetrics
|
6
|
+
|
7
|
+
|
8
|
+
@dataclass
|
9
|
+
class StartExperimentRequest:
|
10
|
+
projectId: str
|
11
|
+
experimentName: str
|
12
|
+
description: str
|
13
|
+
removeUntaggedUploadedModels: bool = True
|
14
|
+
codeIntegrationVersionId: Optional[str] = None
|
15
|
+
|
16
|
+
@dataclass
|
17
|
+
class StartExperimentResponse:
|
18
|
+
projectId: str
|
19
|
+
versionId: str
|
20
|
+
experimentId: str
|
21
|
+
|
22
|
+
@dataclass
|
23
|
+
class GetUploadModelSignedUrlRequest:
|
24
|
+
epoch: int
|
25
|
+
experimentId: str
|
26
|
+
versionId: str
|
27
|
+
projectId: str
|
28
|
+
fileType: str
|
29
|
+
origin: Optional[str] = None
|
30
|
+
|
31
|
+
@dataclass
|
32
|
+
class GetUploadModelSignedUrlResponse:
|
33
|
+
url: str
|
34
|
+
fileName: str
|
35
|
+
|
36
|
+
@dataclass
|
37
|
+
class AddExternalEpochDataRequest:
|
38
|
+
projectId: str
|
39
|
+
experimentId: str
|
40
|
+
epoch: int
|
41
|
+
metrics: ApiMetrics
|
42
|
+
force: bool = False
|
43
|
+
|
44
|
+
@dataclass
|
45
|
+
class TagModelRequest:
|
46
|
+
projectId: str
|
47
|
+
experimentId: str
|
48
|
+
epoch: int
|
49
|
+
tags: List[str]
|
50
|
+
|
51
|
+
@dataclass
|
52
|
+
class SetExperimentNotesRequest:
|
53
|
+
projectId: str
|
54
|
+
experimentId: str
|
55
|
+
notes: Dict[str, Any]
|
56
|
+
|
57
|
+
class Api:
|
58
|
+
def __init__(self, client: Client):
|
59
|
+
self.client = client
|
60
|
+
|
61
|
+
def start_experiment(self, data: StartExperimentRequest) -> StartExperimentResponse:
|
62
|
+
response = self.client.post('/versions/startExperiment', data)
|
63
|
+
self.client.check_response(response)
|
64
|
+
return StartExperimentResponse(**response.json())
|
65
|
+
|
66
|
+
def get_uploaded_model_signed_url(self, data: GetUploadModelSignedUrlRequest)-> GetUploadModelSignedUrlResponse:
|
67
|
+
response = self.client.post('/versions/getUploadModelSignedUrl', data)
|
68
|
+
self.client.check_response(response)
|
69
|
+
return GetUploadModelSignedUrlResponse(**response.json())
|
70
|
+
|
71
|
+
def add_external_epoch_data(self, data: AddExternalEpochDataRequest)-> None:
|
72
|
+
response = self.client.post('/externalepochdata/addExternalEpochData', data)
|
73
|
+
self.client.check_response(response)
|
74
|
+
|
75
|
+
def tag_model(self, data: TagModelRequest)-> None:
|
76
|
+
response = self.client.post('/versions/tagModel', data)
|
77
|
+
self.client.check_response(response)
|
78
|
+
|
79
|
+
def set_experiment_notes(self, data: SetExperimentNotesRequest)-> None:
|
80
|
+
response = self.client.post('/versions/setExperimentNotes', data)
|
81
|
+
self.client.check_response(response)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
import os
|
3
|
+
from typing import Dict, Optional
|
4
|
+
import yaml
|
5
|
+
|
6
|
+
@dataclass
|
7
|
+
class AuthConfig:
|
8
|
+
api_url: str
|
9
|
+
api_key: str
|
10
|
+
|
11
|
+
@dataclass
|
12
|
+
class Config:
|
13
|
+
current_env: str
|
14
|
+
envs: Dict[str, AuthConfig]
|
15
|
+
|
16
|
+
def get_cli_conf_path()-> str:
|
17
|
+
cli_conf_path = os.getenv("TL_CLI_CONFIG_FILE") or os.path.join(os.path.expanduser("~"), ".config/tensorleap/config.yaml")
|
18
|
+
return cli_conf_path
|
19
|
+
|
20
|
+
def get_cli_conf_file() -> Optional[Config]:
|
21
|
+
cli_conf_path = get_cli_conf_path()
|
22
|
+
if not os.path.exists(cli_conf_path):
|
23
|
+
return None
|
24
|
+
with open(cli_conf_path) as f:
|
25
|
+
config_yaml = yaml.safe_load(f)
|
26
|
+
envs_dict = config_yaml.get("envs")
|
27
|
+
if envs_dict is None:
|
28
|
+
return None
|
29
|
+
envs = dict()
|
30
|
+
for k, v in envs_dict.items():
|
31
|
+
envs[k] = AuthConfig(**v)
|
32
|
+
return Config(envs=envs, current_env=config_yaml["current_env"])
|
33
|
+
|
34
|
+
def get_auth_config() -> Optional[AuthConfig]:
|
35
|
+
cli_conf = get_cli_conf_file()
|
36
|
+
if cli_conf is None or cli_conf.current_env not in cli_conf.envs:
|
37
|
+
return None
|
38
|
+
return cli_conf.envs[cli_conf.current_env]
|
39
|
+
|
40
|
+
|
41
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
from typing import Any, Dict, Optional
|
3
|
+
from code_loader.experiment_api.cli_config_utils import get_auth_config
|
4
|
+
from code_loader.experiment_api.utils import join_url, to_dict_no_none
|
5
|
+
import requests
|
6
|
+
|
7
|
+
|
8
|
+
class Client:
|
9
|
+
def __init__(self, url: Optional[str] = None, token: Optional[str] = None):
|
10
|
+
if url is None or token is None:
|
11
|
+
configAuth = get_auth_config()
|
12
|
+
if configAuth is None:
|
13
|
+
raise Exception("No auth config found, either provide url and token or use `leap auth [url] [token]` to setup a config file")
|
14
|
+
url = configAuth.api_url
|
15
|
+
token = configAuth.api_key
|
16
|
+
|
17
|
+
self.url = url
|
18
|
+
self.token = token
|
19
|
+
|
20
|
+
def __add_auth(self, headers: Dict[str, str]) -> Dict[str, str]:
|
21
|
+
headers['Authorization'] = f'Bearer {self.token}'
|
22
|
+
return headers
|
23
|
+
|
24
|
+
def post(self, post_path: str, data: Any, headers: Dict[str, str] = {})-> requests.Response:
|
25
|
+
headers = self.__add_auth(headers)
|
26
|
+
if 'Content-Type' not in headers:
|
27
|
+
headers['Content-Type'] = 'application/json'
|
28
|
+
url = join_url(self.url, post_path)
|
29
|
+
json_data = to_dict_no_none(data)
|
30
|
+
return requests.post(url, json=json_data, headers=headers)
|
31
|
+
|
32
|
+
def check_response(self, response: requests.Response)-> None:
|
33
|
+
if response.status_code >= 400:
|
34
|
+
raise Exception(f"Error: {response.status_code} {response.text}")
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
from typing import List, Optional
|
3
|
+
from code_loader.experiment_api.experiment_context import ExperimentContext
|
4
|
+
from code_loader.experiment_api.types import Metrics
|
5
|
+
from code_loader.experiment_api.utils import to_api_metric_value, upload_file
|
6
|
+
from code_loader.experiment_api.api import AddExternalEpochDataRequest, GetUploadModelSignedUrlRequest, TagModelRequest
|
7
|
+
|
8
|
+
|
9
|
+
class Epoch:
|
10
|
+
def __init__(self, ctx: ExperimentContext, epoch: int):
|
11
|
+
self.experiment = ExperimentContext
|
12
|
+
self.epoch = epoch
|
13
|
+
self.metrics: Metrics = {}
|
14
|
+
self.ctx = ctx
|
15
|
+
|
16
|
+
def add_metric(self, name: str, value: float)-> None:
|
17
|
+
self.metrics[name] = value
|
18
|
+
|
19
|
+
def set_metrics(self, metrics: Metrics)-> None:
|
20
|
+
self.metrics = metrics
|
21
|
+
|
22
|
+
def _upload_model(self, modelFilePath: str)-> None:
|
23
|
+
allowed_extensions = ["h5", "onnx"]
|
24
|
+
modelExtension = modelFilePath.split(".")[-1]
|
25
|
+
if modelExtension not in allowed_extensions:
|
26
|
+
raise Exception(f"Model file extension not allowed. Allowed extensions are {allowed_extensions}")
|
27
|
+
url = self.ctx.api.get_uploaded_model_signed_url(GetUploadModelSignedUrlRequest(
|
28
|
+
epoch=self.epoch,
|
29
|
+
experimentId=self.ctx.experiment_id,
|
30
|
+
versionId=self.ctx.version_id,
|
31
|
+
projectId=self.ctx.project_id,
|
32
|
+
fileType=modelExtension
|
33
|
+
))
|
34
|
+
print(f"Uploading epoch({self.epoch}) model file")
|
35
|
+
upload_file(url.url, modelFilePath)
|
36
|
+
print("Model file uploaded")
|
37
|
+
|
38
|
+
def _tag_model(self, tags: List[str])-> None:
|
39
|
+
print(f"Tagging epoch({self.epoch}) model")
|
40
|
+
self.ctx.api.tag_model(TagModelRequest(
|
41
|
+
experimentId=self.ctx.experiment_id,
|
42
|
+
projectId=self.ctx.project_id,
|
43
|
+
epoch=self.epoch,
|
44
|
+
tags=tags
|
45
|
+
))
|
46
|
+
|
47
|
+
def log(self, modelFilePath: Optional[str] = None, tags: List[str] = ['latest'])-> None:
|
48
|
+
if modelFilePath is not None:
|
49
|
+
self._upload_model(modelFilePath)
|
50
|
+
|
51
|
+
print(f"Add metrics for epoch({self.epoch}) model")
|
52
|
+
api_metrics ={
|
53
|
+
key: to_api_metric_value(value) for key, value in self.metrics.items()
|
54
|
+
}
|
55
|
+
self.ctx.api.add_external_epoch_data(AddExternalEpochDataRequest(
|
56
|
+
experimentId=self.ctx.experiment_id,
|
57
|
+
projectId=self.ctx.project_id,
|
58
|
+
epoch=self.epoch,
|
59
|
+
metrics=api_metrics
|
60
|
+
))
|
61
|
+
if modelFilePath is not None and len(tags) > 0:
|
62
|
+
self._tag_model(tags)
|
63
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
from typing import Any, Dict, List, Optional
|
3
|
+
from code_loader.experiment_api.epoch import Epoch
|
4
|
+
from code_loader.experiment_api.api import Api, SetExperimentNotesRequest, StartExperimentRequest
|
5
|
+
from code_loader.experiment_api.experiment_context import ExperimentContext
|
6
|
+
from code_loader.experiment_api.types import Metrics
|
7
|
+
from code_loader.experiment_api.workingspace_config_utils import load_workspace_config
|
8
|
+
from code_loader.experiment_api.client import Client
|
9
|
+
|
10
|
+
|
11
|
+
class Experiment:
|
12
|
+
def __init__(self, ctx: ExperimentContext):
|
13
|
+
self.ctx = ctx
|
14
|
+
|
15
|
+
def init_epoch(self, epoch: int) -> Epoch:
|
16
|
+
return Epoch(self.ctx, epoch)
|
17
|
+
|
18
|
+
def log_epoch(self, epoch: int, metrics: Optional[Metrics] = None, model_path: Optional[str] = None, tags: List[str] = ['latest'])-> None:
|
19
|
+
epoch_o = self.init_epoch(epoch)
|
20
|
+
if metrics is not None:
|
21
|
+
epoch_o.set_metrics(metrics)
|
22
|
+
epoch_o.log(model_path, tags)
|
23
|
+
|
24
|
+
def set_notes(self, notes: Dict[str, Any])-> None:
|
25
|
+
print(f"Setting experiment({self.ctx.experiment_id}) notes")
|
26
|
+
self.ctx.api.set_experiment_notes(SetExperimentNotesRequest(
|
27
|
+
experimentId=self.ctx.experiment_id,
|
28
|
+
projectId=self.ctx.project_id,
|
29
|
+
notes=notes
|
30
|
+
))
|
31
|
+
|
32
|
+
def init_experiment(experimentName: str, description: str, working_dir: Optional[str] = None, client: Optional[Client] = None) -> 'Experiment':
|
33
|
+
if client is None:
|
34
|
+
client = Client()
|
35
|
+
|
36
|
+
api = Api(client)
|
37
|
+
|
38
|
+
workspace_config = load_workspace_config(working_dir)
|
39
|
+
if workspace_config is None or workspace_config.projectId is None:
|
40
|
+
raise Exception("No leap workspace config found or projectId is missing, make sure you are in a leap workspace directory or provide a working_dir")
|
41
|
+
|
42
|
+
result = api.start_experiment(StartExperimentRequest(
|
43
|
+
projectId=workspace_config.projectId,
|
44
|
+
experimentName=experimentName,
|
45
|
+
description=description,
|
46
|
+
codeIntegrationVersionId=workspace_config.codeIntegrationId
|
47
|
+
))
|
48
|
+
ctx = ExperimentContext(api, result.projectId, result.versionId, result.experimentId)
|
49
|
+
return Experiment(ctx)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import Dict, Union
|
4
|
+
|
5
|
+
|
6
|
+
MetricValue = Union[str, float]
|
7
|
+
Metrics = Dict[str, MetricValue]
|
8
|
+
|
9
|
+
@dataclass
|
10
|
+
class NumericMetricValue:
|
11
|
+
value: float
|
12
|
+
type: str = "number"
|
13
|
+
|
14
|
+
@dataclass
|
15
|
+
class StringMetricValue:
|
16
|
+
value: str
|
17
|
+
type: str = "string"
|
18
|
+
|
19
|
+
@dataclass
|
20
|
+
class ImageMetricValue:
|
21
|
+
value: str
|
22
|
+
type: str = "image"
|
23
|
+
|
24
|
+
ApiMetricValue = Union[NumericMetricValue, StringMetricValue, ImageMetricValue]
|
25
|
+
ApiMetrics = Dict[str, ApiMetricValue]
|
@@ -0,0 +1,35 @@
|
|
1
|
+
from dataclasses import asdict, is_dataclass
|
2
|
+
from typing import Any, Dict, Union
|
3
|
+
from urllib.parse import urljoin
|
4
|
+
from code_loader.experiment_api.types import ApiMetricValue, MetricValue, NumericMetricValue, StringMetricValue
|
5
|
+
import requests
|
6
|
+
|
7
|
+
|
8
|
+
def upload_file(url: str, file_path: str)-> None:
|
9
|
+
with open(file_path, "rb") as f:
|
10
|
+
requests.put(url, data=f, timeout=12_000)
|
11
|
+
|
12
|
+
def to_dict_no_none(data: Any)-> Union[Dict[str, Any], Any]:
|
13
|
+
if is_dataclass(data):
|
14
|
+
data = asdict(data)
|
15
|
+
if isinstance(data, dict):
|
16
|
+
return {k: to_dict_no_none(v) for k, v in data.items() if v is not None}
|
17
|
+
elif isinstance(data, list):
|
18
|
+
return [to_dict_no_none(item) for item in data]
|
19
|
+
else:
|
20
|
+
return data
|
21
|
+
|
22
|
+
def join_url(base_url: str, post_path: str)-> str:
|
23
|
+
if not base_url.endswith('/'):
|
24
|
+
base_url += '/'
|
25
|
+
if post_path.startswith('/'):
|
26
|
+
post_path = post_path[1:]
|
27
|
+
return urljoin(base_url, post_path)
|
28
|
+
|
29
|
+
def to_api_metric_value(value: MetricValue) -> ApiMetricValue:
|
30
|
+
if isinstance(value, float) or isinstance(value, int):
|
31
|
+
return NumericMetricValue(value=value)
|
32
|
+
elif isinstance(value, str):
|
33
|
+
return StringMetricValue(value=value)
|
34
|
+
else:
|
35
|
+
raise Exception(f"Unsupported metric value type: {type(value)}")
|
@@ -0,0 +1,27 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
from os import path
|
3
|
+
import os
|
4
|
+
from typing import List, Optional
|
5
|
+
import yaml
|
6
|
+
|
7
|
+
|
8
|
+
@dataclass
|
9
|
+
class LocalProjectConfig:
|
10
|
+
codeIntegrationId: Optional[str] = None
|
11
|
+
projectId: Optional[str] = None
|
12
|
+
secretId: Optional[str] = None
|
13
|
+
secretManagerId: Optional[str] = None
|
14
|
+
entryFile: Optional[str] = None
|
15
|
+
includePatterns: Optional[List[str]] = None
|
16
|
+
|
17
|
+
# Loading workspace configuration from leap.yaml
|
18
|
+
def load_workspace_config(workspace_dir: Optional[str] = None) -> Optional[LocalProjectConfig]:
|
19
|
+
if workspace_dir is None:
|
20
|
+
workspace_dir = os.getcwd()
|
21
|
+
elif not path.isabs(workspace_dir):
|
22
|
+
workspace_dir = path.join(os.getcwd(), workspace_dir)
|
23
|
+
|
24
|
+
file_path = path.join(workspace_dir, "leap.yaml")
|
25
|
+
with open(file_path) as f:
|
26
|
+
y = yaml.safe_load(f)
|
27
|
+
return LocalProjectConfig(**y)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: code-loader
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.43a1
|
4
4
|
Summary:
|
5
5
|
Home-page: https://github.com/tensorleap/code-loader
|
6
6
|
License: MIT
|
@@ -16,6 +16,8 @@ Classifier: Programming Language :: Python :: 3.11
|
|
16
16
|
Requires-Dist: matplotlib (>=3.3,<3.4)
|
17
17
|
Requires-Dist: numpy (>=1.22.3,<2.0.0)
|
18
18
|
Requires-Dist: psutil (>=5.9.5,<6.0.0)
|
19
|
+
Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
20
|
+
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
19
21
|
Project-URL: Repository, https://github.com/tensorleap/code-loader
|
20
22
|
Description-Content-Type: text/markdown
|
21
23
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
|
2
|
+
code_loader/__init__.py,sha256=6MMWr0ObOU7hkqQKgOqp4Zp3I28L7joGC9iCbQYtAJg,241
|
3
|
+
code_loader/contract/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
+
code_loader/contract/datasetclasses.py,sha256=81TmCcVol7768lzKUp70MatLLipR3ftcR9jgE1r8Yqo,5698
|
5
|
+
code_loader/contract/enums.py,sha256=6Lo7p5CUog68Fd31bCozIuOgIp_IhSiPqWWph2k3OGU,1602
|
6
|
+
code_loader/contract/exceptions.py,sha256=jWqu5i7t-0IG0jGRsKF4DjJdrsdpJjIYpUkN1F4RiyQ,51
|
7
|
+
code_loader/contract/responsedataclasses.py,sha256=w7xVOv2S8Hyb5lqyomMGiKAWXDTSOG-FX1YW39bXD3A,3969
|
8
|
+
code_loader/contract/visualizer_classes.py,sha256=Ka8fJSVKrOeZ12Eg8-dOBGMW0UswYCIkuhnNMd-7z9s,22948
|
9
|
+
code_loader/experiment_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
+
code_loader/experiment_api/api.py,sha256=KI0ml2Dv0LwTNPP0uC5mEIqZqmSE1xaCpTSZBcnIu44,2351
|
11
|
+
code_loader/experiment_api/cli_config_utils.py,sha256=n6JMyNrquxql3KKxHhAP8jAzezlRT-PV2KWI95kKsm0,1140
|
12
|
+
code_loader/experiment_api/client.py,sha256=8kqLWh2Zg7mNA5E9Q0v0qRuPm3OE3Rs7lfGAcXOucU4,1428
|
13
|
+
code_loader/experiment_api/epoch.py,sha256=JDJINIrMGhTGdsXdxc4K_aTI5m7_Vwjyygr4egfv8lU,2500
|
14
|
+
code_loader/experiment_api/experiment.py,sha256=0d0FesAhiCdxJ3x8uEqq7MdBZzxQV58MT52DKRbwp5w,2151
|
15
|
+
code_loader/experiment_api/experiment_context.py,sha256=kdzUbuzXo1pMVslOC3TKeJwW8sx_qWkxDVrswjduH0A,194
|
16
|
+
code_loader/experiment_api/types.py,sha256=MY8xFARHwdVA7p4dxyhD60ShmttgTvb4qdp1oEB_NPg,485
|
17
|
+
code_loader/experiment_api/utils.py,sha256=5_Sat-NL8iY9DO69YEEHpB22i_Iz-d7QxnLZglQ39UQ,1279
|
18
|
+
code_loader/experiment_api/workingspace_config_utils.py,sha256=fNz-xMmkKNTVjePi8r9_baYBFiiH5KO6eUOneCtIvC4,858
|
19
|
+
code_loader/inner_leap_binder/__init__.py,sha256=koOlJyMNYzGbEsoIbXathSmQ-L38N_pEXH_HvL7beXU,99
|
20
|
+
code_loader/inner_leap_binder/leapbinder.py,sha256=fHND8ayIXDlKHufHHq36u5rKNnZq64MmMuI42GctHvQ,24022
|
21
|
+
code_loader/leaploader.py,sha256=pUySweZetJ6SsubCcZlDCJpvWmUrm5YlPlkZWQxY1hQ,17289
|
22
|
+
code_loader/utils.py,sha256=61I4PgSl-ZBIe4DifLxMNlBELE-HQR2pB9efVYPceIU,2230
|
23
|
+
code_loader/visualizers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
24
|
+
code_loader/visualizers/default_visualizers.py,sha256=VoqO9FN84yXyMjRjHjUTOt2GdTkJRMbHbXJ1cJkREkk,2230
|
25
|
+
code_loader-1.0.43a1.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
|
26
|
+
code_loader-1.0.43a1.dist-info/METADATA,sha256=tEPsr4CC9_0hXz_yzU3Ovb5AEShF5I6CTV94tQDuQ4w,890
|
27
|
+
code_loader-1.0.43a1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
28
|
+
code_loader-1.0.43a1.dist-info/RECORD,,
|
@@ -1,18 +0,0 @@
|
|
1
|
-
LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
|
2
|
-
code_loader/__init__.py,sha256=V3DEXSN6Ie6PlGeSAbzjp9ufRj0XPJLpD7pDLLYxk6M,122
|
3
|
-
code_loader/contract/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
-
code_loader/contract/datasetclasses.py,sha256=81TmCcVol7768lzKUp70MatLLipR3ftcR9jgE1r8Yqo,5698
|
5
|
-
code_loader/contract/enums.py,sha256=6Lo7p5CUog68Fd31bCozIuOgIp_IhSiPqWWph2k3OGU,1602
|
6
|
-
code_loader/contract/exceptions.py,sha256=jWqu5i7t-0IG0jGRsKF4DjJdrsdpJjIYpUkN1F4RiyQ,51
|
7
|
-
code_loader/contract/responsedataclasses.py,sha256=w7xVOv2S8Hyb5lqyomMGiKAWXDTSOG-FX1YW39bXD3A,3969
|
8
|
-
code_loader/contract/visualizer_classes.py,sha256=Ka8fJSVKrOeZ12Eg8-dOBGMW0UswYCIkuhnNMd-7z9s,22948
|
9
|
-
code_loader/inner_leap_binder/__init__.py,sha256=koOlJyMNYzGbEsoIbXathSmQ-L38N_pEXH_HvL7beXU,99
|
10
|
-
code_loader/inner_leap_binder/leapbinder.py,sha256=fHND8ayIXDlKHufHHq36u5rKNnZq64MmMuI42GctHvQ,24022
|
11
|
-
code_loader/leaploader.py,sha256=pUySweZetJ6SsubCcZlDCJpvWmUrm5YlPlkZWQxY1hQ,17289
|
12
|
-
code_loader/utils.py,sha256=61I4PgSl-ZBIe4DifLxMNlBELE-HQR2pB9efVYPceIU,2230
|
13
|
-
code_loader/visualizers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
|
-
code_loader/visualizers/default_visualizers.py,sha256=VoqO9FN84yXyMjRjHjUTOt2GdTkJRMbHbXJ1cJkREkk,2230
|
15
|
-
code_loader-1.0.43.dist-info/LICENSE,sha256=qIwWjdspQeSMTtnFZBC8MuT-95L02FPvzRUdWFxrwJY,1067
|
16
|
-
code_loader-1.0.43.dist-info/METADATA,sha256=FO-vqcxPvPCvmVbDXmgc5ne0o2pSnKF9NsP2w0j_Ub8,807
|
17
|
-
code_loader-1.0.43.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
18
|
-
code_loader-1.0.43.dist-info/RECORD,,
|
File without changes
|
File without changes
|