bluer-objects 6.139.1__py3-none-any.whl → 6.155.1__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.
Potentially problematic release.
This version of bluer-objects might be problematic. Click here for more details.
- bluer_objects/__init__.py +1 -1
- bluer_objects/config.env +3 -1
- bluer_objects/env.py +7 -0
- bluer_objects/mlflow/logging.py +47 -41
- bluer_objects/sample.env +4 -0
- bluer_objects/storage/__init__.py +4 -1
- bluer_objects/storage/s3.py +186 -0
- bluer_objects/tests/test_env.py +13 -3
- bluer_objects/tests/test_file_load_save.py +0 -1
- bluer_objects/tests/test_storage_s3.py +67 -0
- bluer_objects/tests/test_storage_webdav_request.py +3 -0
- bluer_objects/tests/test_storage_webdav_zip.py +3 -0
- {bluer_objects-6.139.1.dist-info → bluer_objects-6.155.1.dist-info}/METADATA +3 -2
- {bluer_objects-6.139.1.dist-info → bluer_objects-6.155.1.dist-info}/RECORD +17 -15
- {bluer_objects-6.139.1.dist-info → bluer_objects-6.155.1.dist-info}/WHEEL +0 -0
- {bluer_objects-6.139.1.dist-info → bluer_objects-6.155.1.dist-info}/licenses/LICENSE +0 -0
- {bluer_objects-6.139.1.dist-info → bluer_objects-6.155.1.dist-info}/top_level.txt +0 -0
bluer_objects/__init__.py
CHANGED
bluer_objects/config.env
CHANGED
bluer_objects/env.py
CHANGED
|
@@ -35,6 +35,12 @@ DUMMY_TEXT = "This is some dummy text. This is some dummy text. This is some dum
|
|
|
35
35
|
|
|
36
36
|
ABCLI_MLFLOW_EXPERIMENT_PREFIX = get_env("ABCLI_MLFLOW_EXPERIMENT_PREFIX")
|
|
37
37
|
|
|
38
|
+
S3_STORAGE_BUCKET = get_env("S3_STORAGE_BUCKET")
|
|
39
|
+
|
|
40
|
+
S3_STORAGE_ENDPOINT_URL = get_env("S3_STORAGE_ENDPOINT_URL")
|
|
41
|
+
S3_STORAGE_AWS_ACCESS_KEY_ID = get_env("S3_STORAGE_AWS_ACCESS_KEY_ID")
|
|
42
|
+
S3_STORAGE_AWS_SECRET_ACCESS_KEY = get_env("S3_STORAGE_AWS_SECRET_ACCESS_KEY")
|
|
43
|
+
|
|
38
44
|
BLUER_OBJECTS_STORAGE_INTERFACE = get_env("BLUER_OBJECTS_STORAGE_INTERFACE")
|
|
39
45
|
|
|
40
46
|
MLFLOW_DEPLOYMENT = get_env("MLFLOW_DEPLOYMENT", "local")
|
|
@@ -46,6 +52,7 @@ if MLFLOW_DEPLOYMENT == "local":
|
|
|
46
52
|
else:
|
|
47
53
|
MLFLOW_TRACKING_URI = MLFLOW_DEPLOYMENT
|
|
48
54
|
os.environ["MLFLOW_TRACKING_URI"] = MLFLOW_TRACKING_URI
|
|
55
|
+
MLFLOW_LOG_ARTIFACTS = "arvan" not in MLFLOW_DEPLOYMENT
|
|
49
56
|
|
|
50
57
|
WEBDAV_HOSTNAME = get_env("WEBDAV_HOSTNAME")
|
|
51
58
|
WEBDAV_LOGIN = get_env("WEBDAV_LOGIN")
|
bluer_objects/mlflow/logging.py
CHANGED
|
@@ -6,7 +6,7 @@ import mlflow
|
|
|
6
6
|
from blueness import module
|
|
7
7
|
from bluer_options.logger import crash_report
|
|
8
8
|
|
|
9
|
-
from bluer_objects import file, objects, NAME
|
|
9
|
+
from bluer_objects import file, objects, NAME, env
|
|
10
10
|
from bluer_objects.mlflow.runs import start_run, end_run
|
|
11
11
|
from bluer_objects.logger import logger
|
|
12
12
|
|
|
@@ -22,25 +22,28 @@ def log_artifacts(
|
|
|
22
22
|
|
|
23
23
|
object_path = objects.object_path(object_name, create=True)
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
if env.MLFLOW_LOG_ARTIFACTS:
|
|
26
|
+
try:
|
|
27
|
+
mlflow.log_artifacts(object_path)
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
logger.info("⬆️ {}".format(object_name))
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
# https://mlflow.org/docs/latest/python_api/mlflow.html#mlflow.register_model
|
|
32
|
+
# https://stackoverflow.com/a/71447758/17619982
|
|
33
|
+
if model_name:
|
|
34
|
+
mv = mlflow.register_model(
|
|
35
|
+
"runs:/{}".format(mlflow.active_run().info.run_id),
|
|
36
|
+
model_name,
|
|
37
|
+
await_registration_for=0,
|
|
38
|
+
)
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
logger.info("*️⃣ {} -> {}.{}".format(object_name, mv.name, mv.version))
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
except:
|
|
43
|
+
crash_report(f"{NAME}.log_artifacts({object_name})")
|
|
44
|
+
return False
|
|
45
|
+
else:
|
|
46
|
+
logger.info("skipped log artifacts.")
|
|
44
47
|
|
|
45
48
|
return end_run(object_name)
|
|
46
49
|
|
|
@@ -51,31 +54,34 @@ def log_run(object_name: str) -> bool:
|
|
|
51
54
|
|
|
52
55
|
object_path = objects.object_path(object_name, create=True)
|
|
53
56
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
for
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
filename_name = file.name(filename)
|
|
61
|
-
|
|
62
|
-
counts[len(filename_name)] = counts.get(len(filename_name), 0) + 1
|
|
63
|
-
|
|
64
|
-
if any(
|
|
65
|
-
[
|
|
66
|
-
file.size(filename) > 10 * 1024 * 1024,
|
|
67
|
-
filename_name.startswith("thumbnail"),
|
|
68
|
-
counts[len(filename_name)] > 20,
|
|
69
|
-
]
|
|
57
|
+
if env.MLFLOW_LOG_ARTIFACTS:
|
|
58
|
+
counts: Dict[str, int] = {}
|
|
59
|
+
skipped_count = 0
|
|
60
|
+
for extension in "dot,gif,jpeg,jpg,json,png,sh,xml,yaml".split(","):
|
|
61
|
+
for filename in glob.glob(
|
|
62
|
+
os.path.join(object_path, f"*.{extension}"),
|
|
70
63
|
):
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
64
|
+
filename_name = file.name(filename)
|
|
65
|
+
|
|
66
|
+
counts[len(filename_name)] = counts.get(len(filename_name), 0) + 1
|
|
67
|
+
|
|
68
|
+
if any(
|
|
69
|
+
[
|
|
70
|
+
file.size(filename) > 10 * 1024 * 1024,
|
|
71
|
+
filename_name.startswith("thumbnail"),
|
|
72
|
+
counts[len(filename_name)] > 20,
|
|
73
|
+
]
|
|
74
|
+
):
|
|
75
|
+
logger.info(f"skipping {filename}")
|
|
76
|
+
skipped_count += 1
|
|
77
|
+
continue
|
|
78
|
+
|
|
79
|
+
mlflow.log_artifact(filename)
|
|
80
|
+
logger.info(f"⬆️ {filename}")
|
|
81
|
+
|
|
82
|
+
if skipped_count:
|
|
83
|
+
logger.info(f"skipped {skipped_count:,} file(s).")
|
|
84
|
+
else:
|
|
85
|
+
logger.info("skipped log artifacts.")
|
|
80
86
|
|
|
81
87
|
return end_run(object_name)
|
bluer_objects/sample.env
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from typing import Tuple, List
|
|
2
2
|
|
|
3
|
+
from bluer_objects.storage.s3 import S3Interface
|
|
3
4
|
from bluer_objects.storage.base import StorageInterface
|
|
4
5
|
from bluer_objects.storage.WebDAV import WebDAVInterface
|
|
5
6
|
from bluer_objects.storage.WebDAVrequest import WebDAVRequestInterface
|
|
@@ -9,7 +10,9 @@ from bluer_objects.logger import logger
|
|
|
9
10
|
|
|
10
11
|
interface = StorageInterface()
|
|
11
12
|
|
|
12
|
-
if env.BLUER_OBJECTS_STORAGE_INTERFACE ==
|
|
13
|
+
if env.BLUER_OBJECTS_STORAGE_INTERFACE == S3Interface.name:
|
|
14
|
+
interface = S3Interface()
|
|
15
|
+
elif env.BLUER_OBJECTS_STORAGE_INTERFACE == WebDAVInterface.name:
|
|
13
16
|
interface = WebDAVInterface()
|
|
14
17
|
elif env.BLUER_OBJECTS_STORAGE_INTERFACE == WebDAVRequestInterface.name:
|
|
15
18
|
interface = WebDAVRequestInterface()
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import boto3
|
|
2
|
+
from botocore.exceptions import ClientError
|
|
3
|
+
import glob
|
|
4
|
+
from typing import Tuple, List
|
|
5
|
+
from xml.etree import ElementTree as ET
|
|
6
|
+
from tqdm import tqdm
|
|
7
|
+
from functools import reduce
|
|
8
|
+
|
|
9
|
+
from bluer_objects.storage.base import StorageInterface
|
|
10
|
+
from bluer_objects import env, file, path
|
|
11
|
+
from bluer_objects import objects
|
|
12
|
+
from bluer_objects.logger import logger
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# https://docs.arvancloud.ir/fa/developer-tools/sdk/object-storage/
|
|
16
|
+
class S3Interface(StorageInterface):
|
|
17
|
+
name = "s3"
|
|
18
|
+
|
|
19
|
+
def download(
|
|
20
|
+
self,
|
|
21
|
+
object_name: str,
|
|
22
|
+
filename: str = "",
|
|
23
|
+
log: bool = True,
|
|
24
|
+
) -> bool:
|
|
25
|
+
if filename:
|
|
26
|
+
local_path = objects.path_of(
|
|
27
|
+
object_name=object_name,
|
|
28
|
+
filename=filename,
|
|
29
|
+
create=True,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
if not path.create(file.path(local_path)):
|
|
33
|
+
return False
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
s3_resource = boto3.resource(
|
|
37
|
+
"s3",
|
|
38
|
+
endpoint_url=env.S3_STORAGE_ENDPOINT_URL,
|
|
39
|
+
aws_access_key_id=env.S3_STORAGE_AWS_ACCESS_KEY_ID,
|
|
40
|
+
aws_secret_access_key=env.S3_STORAGE_AWS_SECRET_ACCESS_KEY,
|
|
41
|
+
)
|
|
42
|
+
except Exception as e:
|
|
43
|
+
logger.error(e)
|
|
44
|
+
return False
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
bucket = s3_resource.Bucket(env.S3_STORAGE_BUCKET)
|
|
48
|
+
|
|
49
|
+
bucket.download_file(
|
|
50
|
+
f"{object_name}/{filename}",
|
|
51
|
+
local_path,
|
|
52
|
+
)
|
|
53
|
+
except ClientError as e:
|
|
54
|
+
if int(e.response["Error"]["Code"]) == 404: # Not found
|
|
55
|
+
return True
|
|
56
|
+
logger.error(e)
|
|
57
|
+
return False
|
|
58
|
+
|
|
59
|
+
return super().download(
|
|
60
|
+
object_name=object_name,
|
|
61
|
+
filename=filename,
|
|
62
|
+
log=log,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
success, list_of_files = self.ls(
|
|
66
|
+
object_name=object_name,
|
|
67
|
+
where="cloud",
|
|
68
|
+
)
|
|
69
|
+
if not success:
|
|
70
|
+
return False
|
|
71
|
+
|
|
72
|
+
for filename_ in tqdm(list_of_files):
|
|
73
|
+
if not self.download(
|
|
74
|
+
object_name=object_name,
|
|
75
|
+
filename=filename_,
|
|
76
|
+
log=log,
|
|
77
|
+
):
|
|
78
|
+
return False
|
|
79
|
+
|
|
80
|
+
return True
|
|
81
|
+
|
|
82
|
+
def ls(
|
|
83
|
+
self,
|
|
84
|
+
object_name: str,
|
|
85
|
+
where: str = "local",
|
|
86
|
+
) -> Tuple[bool, List[str]]:
|
|
87
|
+
if where == "cloud":
|
|
88
|
+
try:
|
|
89
|
+
s3 = boto3.client(
|
|
90
|
+
"s3",
|
|
91
|
+
endpoint_url=env.S3_STORAGE_ENDPOINT_URL,
|
|
92
|
+
aws_access_key_id=env.S3_STORAGE_AWS_ACCESS_KEY_ID,
|
|
93
|
+
aws_secret_access_key=env.S3_STORAGE_AWS_SECRET_ACCESS_KEY,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
prefix = f"{object_name}/"
|
|
97
|
+
|
|
98
|
+
paginator = s3.get_paginator("list_objects_v2")
|
|
99
|
+
pages = paginator.paginate(
|
|
100
|
+
Bucket=env.S3_STORAGE_BUCKET,
|
|
101
|
+
Prefix=prefix,
|
|
102
|
+
)
|
|
103
|
+
except Exception as e:
|
|
104
|
+
logger.error(e)
|
|
105
|
+
return False, []
|
|
106
|
+
|
|
107
|
+
return True, sorted(
|
|
108
|
+
reduce(
|
|
109
|
+
lambda x, y: x + y,
|
|
110
|
+
[
|
|
111
|
+
[
|
|
112
|
+
obj["Key"].split(prefix, 1)[1]
|
|
113
|
+
for obj in page.get("Contents", [])
|
|
114
|
+
]
|
|
115
|
+
for page in pages
|
|
116
|
+
],
|
|
117
|
+
[],
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
return super().ls(
|
|
122
|
+
object_name=object_name,
|
|
123
|
+
where=where,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def upload(
|
|
127
|
+
self,
|
|
128
|
+
object_name: str,
|
|
129
|
+
filename: str = "",
|
|
130
|
+
log: bool = True,
|
|
131
|
+
) -> bool:
|
|
132
|
+
if filename:
|
|
133
|
+
local_path = objects.path_of(
|
|
134
|
+
object_name=object_name,
|
|
135
|
+
filename=filename,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
try:
|
|
139
|
+
s3_resource = boto3.resource(
|
|
140
|
+
"s3",
|
|
141
|
+
endpoint_url=env.S3_STORAGE_ENDPOINT_URL,
|
|
142
|
+
aws_access_key_id=env.S3_STORAGE_AWS_ACCESS_KEY_ID,
|
|
143
|
+
aws_secret_access_key=env.S3_STORAGE_AWS_SECRET_ACCESS_KEY,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
bucket = s3_resource.Bucket(env.S3_STORAGE_BUCKET)
|
|
147
|
+
|
|
148
|
+
with open(local_path, "rb") as fp:
|
|
149
|
+
bucket.put_object(
|
|
150
|
+
ACL="private",
|
|
151
|
+
Body=fp,
|
|
152
|
+
Key=f"{object_name}/{filename}",
|
|
153
|
+
)
|
|
154
|
+
except ClientError as e:
|
|
155
|
+
logger.error(e)
|
|
156
|
+
return False
|
|
157
|
+
|
|
158
|
+
return super().upload(
|
|
159
|
+
object_name=object_name,
|
|
160
|
+
filename=filename,
|
|
161
|
+
log=log,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
object_path = "{}/".format(objects.object_path(object_name=object_name))
|
|
165
|
+
for filename_ in tqdm(
|
|
166
|
+
sorted(
|
|
167
|
+
glob.glob(
|
|
168
|
+
objects.path_of(
|
|
169
|
+
object_name=object_name,
|
|
170
|
+
filename="**",
|
|
171
|
+
),
|
|
172
|
+
recursive=True,
|
|
173
|
+
)
|
|
174
|
+
)
|
|
175
|
+
):
|
|
176
|
+
if not file.exists(filename_):
|
|
177
|
+
continue
|
|
178
|
+
|
|
179
|
+
if not self.upload(
|
|
180
|
+
object_name=object_name,
|
|
181
|
+
filename=filename_.split(object_path, 1)[1],
|
|
182
|
+
log=log,
|
|
183
|
+
):
|
|
184
|
+
return False
|
|
185
|
+
|
|
186
|
+
return True
|
bluer_objects/tests/test_env.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
from bluer_ai.tests.test_env import test_bluer_ai_env
|
|
2
2
|
|
|
3
3
|
from bluer_objects import env
|
|
4
|
-
from bluer_objects.storage
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
from bluer_objects.storage import (
|
|
5
|
+
S3Interface,
|
|
6
|
+
WebDAVInterface,
|
|
7
|
+
WebDAVRequestInterface,
|
|
8
|
+
WebDAVzipInterface,
|
|
9
|
+
)
|
|
7
10
|
|
|
8
11
|
|
|
9
12
|
def test_required_env():
|
|
@@ -13,7 +16,14 @@ def test_required_env():
|
|
|
13
16
|
def test_bluer_objects_env():
|
|
14
17
|
assert env.ABCLI_MLFLOW_EXPERIMENT_PREFIX
|
|
15
18
|
|
|
19
|
+
assert env.S3_STORAGE_BUCKET
|
|
20
|
+
|
|
21
|
+
assert env.S3_STORAGE_ENDPOINT_URL
|
|
22
|
+
assert env.S3_STORAGE_AWS_ACCESS_KEY_ID
|
|
23
|
+
assert env.S3_STORAGE_AWS_SECRET_ACCESS_KEY
|
|
24
|
+
|
|
16
25
|
assert env.BLUER_OBJECTS_STORAGE_INTERFACE in [
|
|
26
|
+
S3Interface.name,
|
|
17
27
|
WebDAVInterface.name,
|
|
18
28
|
WebDAVRequestInterface.name,
|
|
19
29
|
WebDAVzipInterface.name,
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from bluer_objects import objects
|
|
2
|
+
from bluer_objects.testing import create_test_asset
|
|
3
|
+
from bluer_objects.storage import S3Interface
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_storage_s3():
|
|
7
|
+
object_name = objects.unique_object("test_storage_s3")
|
|
8
|
+
|
|
9
|
+
assert create_test_asset(
|
|
10
|
+
object_name=object_name,
|
|
11
|
+
depth=10,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
storage = S3Interface()
|
|
15
|
+
|
|
16
|
+
success, list_of_files_local = storage.ls(
|
|
17
|
+
object_name=object_name,
|
|
18
|
+
where="local",
|
|
19
|
+
)
|
|
20
|
+
assert success
|
|
21
|
+
assert list_of_files_local
|
|
22
|
+
|
|
23
|
+
success, list_of_files_cloud = storage.ls(
|
|
24
|
+
object_name=object_name,
|
|
25
|
+
where="cloud",
|
|
26
|
+
)
|
|
27
|
+
assert success
|
|
28
|
+
assert not list_of_files_cloud
|
|
29
|
+
|
|
30
|
+
for filename in [
|
|
31
|
+
"this.yaml",
|
|
32
|
+
"subfolder/this.yaml",
|
|
33
|
+
"test-00.png",
|
|
34
|
+
]:
|
|
35
|
+
assert storage.upload(
|
|
36
|
+
object_name=object_name,
|
|
37
|
+
filename=filename,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
success, list_of_files_cloud = storage.ls(
|
|
41
|
+
object_name=object_name,
|
|
42
|
+
where="cloud",
|
|
43
|
+
)
|
|
44
|
+
assert success
|
|
45
|
+
assert list_of_files_cloud
|
|
46
|
+
|
|
47
|
+
assert storage.upload(object_name=object_name)
|
|
48
|
+
|
|
49
|
+
success, list_of_files_cloud = storage.ls(
|
|
50
|
+
object_name=object_name,
|
|
51
|
+
where="cloud",
|
|
52
|
+
)
|
|
53
|
+
assert success
|
|
54
|
+
assert list_of_files_cloud
|
|
55
|
+
assert list_of_files_cloud == list_of_files_local
|
|
56
|
+
|
|
57
|
+
for filename in [
|
|
58
|
+
"this.yaml",
|
|
59
|
+
"subfolder/this.yaml",
|
|
60
|
+
"test-00.png",
|
|
61
|
+
]:
|
|
62
|
+
assert storage.download(
|
|
63
|
+
object_name=object_name,
|
|
64
|
+
filename=filename,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
assert storage.download(object_name=object_name)
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
1
3
|
from bluer_objects import objects
|
|
2
4
|
from bluer_objects.testing import create_test_asset
|
|
3
5
|
from bluer_objects.storage import WebDAVRequestInterface
|
|
4
6
|
|
|
5
7
|
|
|
8
|
+
@pytest.mark.skip(reason="nodisk is super slow")
|
|
6
9
|
def test_storage_webdav_request():
|
|
7
10
|
object_name = objects.unique_object("test_storage_webdav_request")
|
|
8
11
|
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
1
3
|
from bluer_objects import objects
|
|
2
4
|
from bluer_objects.testing import create_test_asset
|
|
3
5
|
from bluer_objects.storage import WebDAVzipInterface
|
|
4
6
|
|
|
5
7
|
|
|
8
|
+
@pytest.mark.skip(reason="nodisk is super slow")
|
|
6
9
|
def test_storage_webdav_zip():
|
|
7
10
|
object_name = objects.unique_object("test_storage_webdav_zip")
|
|
8
11
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bluer_objects
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.155.1
|
|
4
4
|
Summary: 🌀 Object management in Bash.
|
|
5
5
|
Home-page: https://github.com/kamangir/bluer-objects
|
|
6
6
|
Author: Arash Abadpour (Kamangir)
|
|
@@ -12,6 +12,7 @@ Classifier: Operating System :: OS Independent
|
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: bluer_ai
|
|
15
|
+
Requires-Dist: boto3
|
|
15
16
|
Requires-Dist: webdavclient3
|
|
16
17
|
Requires-Dist: dill
|
|
17
18
|
Requires-Dist: mlflow
|
|
@@ -63,6 +64,6 @@ pip install bluer-objects
|
|
|
63
64
|
|
|
64
65
|
[](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml) [](https://pypi.org/project/bluer-objects/) [](https://pypistats.org/packages/bluer-objects)
|
|
65
66
|
|
|
66
|
-
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_objects-6.
|
|
67
|
+
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_objects-6.155.1`](https://github.com/kamangir/bluer-objects).
|
|
67
68
|
|
|
68
69
|
built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
bluer_objects/__init__.py,sha256=
|
|
1
|
+
bluer_objects/__init__.py,sha256=SI2bYRTAof62w9VKNRAYmPllTvuhoSuD6p4KuzBTd34,315
|
|
2
2
|
bluer_objects/__main__.py,sha256=Yqfov833_hJuRne19WrGhT5DWAPtdffpoMxeSXS7EGw,359
|
|
3
|
-
bluer_objects/config.env,sha256=
|
|
4
|
-
bluer_objects/env.py,sha256=
|
|
3
|
+
bluer_objects/config.env,sha256=95lXp0kUrsGoUetHgxJpQ4QD16TdFyf-u1AiKBhtrlQ,106
|
|
4
|
+
bluer_objects/env.py,sha256=ZVA8hZfpyuZ493lVkN9vFbUjVlrkrrH6wjC_DcZg52k,1795
|
|
5
5
|
bluer_objects/markdown.py,sha256=PhAwCTHIisO9qOpKHeb63U5oD9Zi8LnIQKTx_OWS4wE,938
|
|
6
6
|
bluer_objects/objects.py,sha256=EYzA1vKngY2c_gdMKnUfrKVUcf-5wpFKgBFaVJA4cLE,1626
|
|
7
7
|
bluer_objects/path.py,sha256=9uspZqObI29NerVDF30uILLaouDtloASh0Mywyq2_ew,3946
|
|
8
|
-
bluer_objects/sample.env,sha256=
|
|
8
|
+
bluer_objects/sample.env,sha256=pk6q6VaCMTqAQmtk0WGzSLIW3bOQkS_sVqhzW59Of34,162
|
|
9
9
|
bluer_objects/urls.py,sha256=paHaYlLMQOI46-EYNch5ohu9Q09BMkF2vvJy1QufrVI,19
|
|
10
10
|
bluer_objects/.abcli/abcli.sh,sha256=zcqSfpuonb7u9YZCO6jbYeU63pTi0WD5q7lBMSUBXqw,352
|
|
11
11
|
bluer_objects/.abcli/actions.sh,sha256=HZI-X5KUy6bXEHmxywfBN1zbHalU0mcTblTQ2HvIfOE,236
|
|
@@ -104,7 +104,7 @@ bluer_objects/metadata/post.py,sha256=1r0yLmIuEPrKJ_-RfALC5ajpLzmUqEjLYoIQMuI4Jj
|
|
|
104
104
|
bluer_objects/mlflow/__init__.py,sha256=GVPXTclqYAyu-iJoLeHSgTaMeoMpVaczFgU4PavS3QA,523
|
|
105
105
|
bluer_objects/mlflow/__main__.py,sha256=uPRUT0x__m1jJ-TTRHmzSdv3AEFM2oKGqOJOG6wdSMk,5819
|
|
106
106
|
bluer_objects/mlflow/cache.py,sha256=RQu9hLI6oRhCvj0N1VLcynSutjsxU4wQDo7N3m3i3ho,310
|
|
107
|
-
bluer_objects/mlflow/logging.py,sha256=
|
|
107
|
+
bluer_objects/mlflow/logging.py,sha256=tyECJl56SY7IsLAuMUsmXoAuyGFLcwKqrbrj5y_IvYE,2612
|
|
108
108
|
bluer_objects/mlflow/models.py,sha256=6xU64Irq9LWyWFwzDJoqMN8KGziSv9VbOGv1tALzf9M,1280
|
|
109
109
|
bluer_objects/mlflow/objects.py,sha256=aXYHLRCTt1FtDQoyPOG-doCFms7qF6Krz00Fg3kzJSM,1844
|
|
110
110
|
bluer_objects/mlflow/runs.py,sha256=v1IKRvxbuKkengESnG-xdUXxxNSkALMeBmfMQwrUKSs,2416
|
|
@@ -113,17 +113,18 @@ bluer_objects/mlflow/testing.py,sha256=cJH5Ki02fJN_Xos1j9yvwQChXvMkOa9i12vtDKmkb
|
|
|
113
113
|
bluer_objects/storage/WebDAV.py,sha256=IvYZDST6Cg1rgRhQ5eh3Hrq8V7S3oon9O29MH55QLxA,2922
|
|
114
114
|
bluer_objects/storage/WebDAVrequest.py,sha256=ihWOxP7h28qj0-5AZ0SsERSBrViq9p4iNVeR4pGBWQo,9836
|
|
115
115
|
bluer_objects/storage/WebDAVzip.py,sha256=Sd_rU57pJaRa05sKNQiMr85Bg3w7O5k8N1pSN1u8omA,3872
|
|
116
|
-
bluer_objects/storage/__init__.py,sha256=
|
|
116
|
+
bluer_objects/storage/__init__.py,sha256=XosPRjB20wDS-QMwQtr3zqKC9UM7U8z-PHwySGBegcQ,1646
|
|
117
117
|
bluer_objects/storage/__main__.py,sha256=vZI6rUkrekf1eYUgWOOUnFhl4qPfpByzwb-tihTOiIo,1776
|
|
118
118
|
bluer_objects/storage/base.py,sha256=72I1zvlpbQbFU20TxqcTodR4m8PYgBPXMfteek8V0_A,1949
|
|
119
|
+
bluer_objects/storage/s3.py,sha256=Xm0Dj2qQG8oEJyAM91NV9clDxGJxyN3FQughlFvP17w,5460
|
|
119
120
|
bluer_objects/testing/__init__.py,sha256=DWY5ZtvCnHG_t9BDiqy_ArLOZi-nlyAtPVMLA1PPAMU,62
|
|
120
121
|
bluer_objects/testing/__main__.py,sha256=hhJV9qn0V_8FxzNDcoHCHr4A7zf9UudnNGJCAPkTBGU,750
|
|
121
122
|
bluer_objects/testing/functions.py,sha256=AXAfzWLcEPkbSYTehdahshjKJ45C4IJkRs_TgrHOntc,1355
|
|
122
123
|
bluer_objects/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
123
124
|
bluer_objects/tests/test_README.py,sha256=5D4UV8VcjbeAPThsYVynYtVFuP8gwMAhIjEWuOQZsWs,89
|
|
124
|
-
bluer_objects/tests/test_env.py,sha256=
|
|
125
|
+
bluer_objects/tests/test_env.py,sha256=Oe-Y-WC0tLVAW7n4QwMqx9pZN7a9nOyu1RPDomUdDos,818
|
|
125
126
|
bluer_objects/tests/test_file_download.py,sha256=1_adHYqgSifkdP-I7TQVW0t8MLCujQ61fvRbcrSkcmg,512
|
|
126
|
-
bluer_objects/tests/test_file_load_save.py,sha256=
|
|
127
|
+
bluer_objects/tests/test_file_load_save.py,sha256=unqxfiqba6RVhMS95AtHZWsT7Q097jBOKdckAT9PyFU,2390
|
|
127
128
|
bluer_objects/tests/test_file_load_save_text.py,sha256=3XnBGlv3KZvheHY-RlX1Su6LOBkkn57pkf9_dXR81r8,1017
|
|
128
129
|
bluer_objects/tests/test_fullname.py,sha256=xWFf9qqzDQ-4RxRyvyR9GWZyU5qNrKxru94UUKMJfPk,80
|
|
129
130
|
bluer_objects/tests/test_graphics.py,sha256=mEuk0rWLwr7b2nv4FH6f-RphwfqP23xe2pkjhWe0HgU,238
|
|
@@ -141,12 +142,13 @@ bluer_objects/tests/test_objects.py,sha256=pqdXvnAJ5WPlHvqqaKrd9-vqktrE9GOVxSgqH
|
|
|
141
142
|
bluer_objects/tests/test_path.py,sha256=JjONWyhZyMM_u1SzD1RI_iZ5vYJDUe-B51fbbHczIig,85
|
|
142
143
|
bluer_objects/tests/test_storage.py,sha256=3kFq4lVuvHIpHYob6YprqNdiPaZKgSdMJSsCZ-nvXdI,822
|
|
143
144
|
bluer_objects/tests/test_storage_base.py,sha256=ieuuuldGWdximvckpiP-y5bUe3tQd-1hatCyxYPTtfg,949
|
|
144
|
-
bluer_objects/tests/
|
|
145
|
-
bluer_objects/tests/
|
|
145
|
+
bluer_objects/tests/test_storage_s3.py,sha256=otgWqAzQBC7_RoNCyNoKUbONVlm18DSKQF8MUj9deHQ,1567
|
|
146
|
+
bluer_objects/tests/test_storage_webdav_request.py,sha256=h2b8PeIx0-hQ2d6PmQcJZyQf59L3fDAzTbKg4SNV-SE,1769
|
|
147
|
+
bluer_objects/tests/test_storage_webdav_zip.py,sha256=C19qxhkcHyTwVFzW35vL85SOcXJPkqXXaWUNll0Uyqc,1017
|
|
146
148
|
bluer_objects/tests/test_testing.py,sha256=d2NH435yqJBl9wmfMqGGd-f0Y0jsL2QhHUXkty9AwPA,235
|
|
147
149
|
bluer_objects/tests/test_version.py,sha256=Lyf3PMcA22e17BNRk_2VgPrtao6dWEgVoXo68Uds8SE,75
|
|
148
|
-
bluer_objects-6.
|
|
149
|
-
bluer_objects-6.
|
|
150
|
-
bluer_objects-6.
|
|
151
|
-
bluer_objects-6.
|
|
152
|
-
bluer_objects-6.
|
|
150
|
+
bluer_objects-6.155.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
|
|
151
|
+
bluer_objects-6.155.1.dist-info/METADATA,sha256=ABeLks5OcoMNh-1udT5ZXQx0EGkm5dr9VvGQLQnrvh4,3575
|
|
152
|
+
bluer_objects-6.155.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
153
|
+
bluer_objects-6.155.1.dist-info/top_level.txt,sha256=RX2TpddbnRkurda3G_pAdyeTztP2IhhRPx949GlEvQo,14
|
|
154
|
+
bluer_objects-6.155.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|