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 CHANGED
@@ -4,7 +4,7 @@ ICON = "🌀"
4
4
 
5
5
  DESCRIPTION = f"{ICON} Object management in Bash."
6
6
 
7
- VERSION = "6.139.1"
7
+ VERSION = "6.155.1"
8
8
 
9
9
  REPO_NAME = "bluer-objects"
10
10
 
bluer_objects/config.env CHANGED
@@ -1,3 +1,5 @@
1
1
  ABCLI_MLFLOW_EXPERIMENT_PREFIX=experiment/
2
2
 
3
- BLUER_OBJECTS_STORAGE_INTERFACE=webdav-request
3
+ S3_STORAGE_BUCKET=kamangir
4
+
5
+ BLUER_OBJECTS_STORAGE_INTERFACE=s3
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")
@@ -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
- try:
26
- mlflow.log_artifacts(object_path)
25
+ if env.MLFLOW_LOG_ARTIFACTS:
26
+ try:
27
+ mlflow.log_artifacts(object_path)
27
28
 
28
- logger.info("⬆️ {}".format(object_name))
29
+ logger.info("⬆️ {}".format(object_name))
29
30
 
30
- # https://mlflow.org/docs/latest/python_api/mlflow.html#mlflow.register_model
31
- # https://stackoverflow.com/a/71447758/17619982
32
- if model_name:
33
- mv = mlflow.register_model(
34
- "runs:/{}".format(mlflow.active_run().info.run_id),
35
- model_name,
36
- await_registration_for=0,
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
- logger.info("*️⃣ {} -> {}.{}".format(object_name, mv.name, mv.version))
40
+ logger.info("*️⃣ {} -> {}.{}".format(object_name, mv.name, mv.version))
40
41
 
41
- except:
42
- crash_report(f"{NAME}.log_artifacts({object_name})")
43
- return False
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
- counts: Dict[str, int] = {}
55
- skipped_count = 0
56
- for extension in "dot,gif,jpeg,jpg,json,png,sh,xml,yaml".split(","):
57
- for filename in glob.glob(
58
- os.path.join(object_path, f"*.{extension}"),
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
- logger.info(f"skipping {filename}")
72
- skipped_count += 1
73
- continue
74
-
75
- mlflow.log_artifact(filename)
76
- logger.info(f"⬆️ {filename}")
77
-
78
- if skipped_count:
79
- logger.info(f"skipped {skipped_count:,} file(s).")
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,3 +1,7 @@
1
+ S3_STORAGE_ENDPOINT_URL=
2
+ S3_STORAGE_AWS_ACCESS_KEY_ID=
3
+ S3_STORAGE_AWS_SECRET_ACCESS_KEY=
4
+
1
5
  MLFLOW_DEPLOYMENT=local
2
6
 
3
7
  WEBDAV_HOSTNAME=
@@ -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 == WebDAVInterface.name:
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
@@ -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.WebDAV import WebDAVInterface
5
- from bluer_objects.storage.WebDAVrequest import WebDAVRequestInterface
6
- from bluer_objects.storage.WebDAVzip import WebDAVzipInterface
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,
@@ -78,7 +78,6 @@ def test_file_load_save(
78
78
  )
79
79
 
80
80
 
81
- @pytest.mark.unit
82
81
  @pytest.mark.parametrize(
83
82
  ["size", "dtype"],
84
83
  [
@@ -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.139.1
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
  [![pylint](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-objects.svg)](https://pypi.org/project/bluer-objects/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/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.139.1`](https://github.com/kamangir/bluer-objects).
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=ITgRDWbzpMhQB_Kbo4IZwv4Csjcnoay3n1hyRP41Ij4,315
1
+ bluer_objects/__init__.py,sha256=SI2bYRTAof62w9VKNRAYmPllTvuhoSuD6p4KuzBTd34,315
2
2
  bluer_objects/__main__.py,sha256=Yqfov833_hJuRne19WrGhT5DWAPtdffpoMxeSXS7EGw,359
3
- bluer_objects/config.env,sha256=OskMqZi0CuvYM4TDq_wzrG7UonxvV0pV6zwObwHaLTI,90
4
- bluer_objects/env.py,sha256=QgXp6tpT_EoFyH83Fi9G25zaUCPP365YfShnVyW-310,1477
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=tvdQQyeWqg-cBlCXW3q0VT_bJbA1yM3nd6v6_1Hhdfs,72
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=XiXNCdpVTAIUqY3GovcghG_t_umr2eRELdbzvNbbf2E,2281
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=RCE6j7b0jP-zhy4DoSjw9Ox8-Iy_z9H92yvSnSs3HpA,1505
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=UxHI0xStpfg1mfNN9QlMBVr7rQsdoEJYQ6vCQh5gExU,689
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=5uUBjyiBglzNn9sAWmjQ8zLnElJ6osJQe2lnQgKk9FQ,2408
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/test_storage_webdav_request.py,sha256=hJVwUBcu4fo1rsRRjk0U4cxJQ-bgNPMJJCIqz_ExaLE,1705
145
- bluer_objects/tests/test_storage_webdav_zip.py,sha256=aFwqREkbEIvJRvkC0Wyfirl_f4tRhtSD3lpNSmQ_BeI,953
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.139.1.dist-info/licenses/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
149
- bluer_objects-6.139.1.dist-info/METADATA,sha256=-6tcYhaaYu5rG0CrZTzqZYEBLLfe1BHsg5TmgugdHEk,3554
150
- bluer_objects-6.139.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
151
- bluer_objects-6.139.1.dist-info/top_level.txt,sha256=RX2TpddbnRkurda3G_pAdyeTztP2IhhRPx949GlEvQo,14
152
- bluer_objects-6.139.1.dist-info/RECORD,,
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,,