dcicutils 8.8.4.1b24__py3-none-any.whl → 8.8.4.1b26__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.
- dcicutils/file_utils.py +15 -5
- dcicutils/http_utils.py +26 -18
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b26.dist-info}/METADATA +1 -1
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b26.dist-info}/RECORD +7 -7
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b26.dist-info}/LICENSE.txt +0 -0
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b26.dist-info}/WHEEL +0 -0
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b26.dist-info}/entry_points.txt +0 -0
dcicutils/file_utils.py
CHANGED
@@ -104,21 +104,25 @@ def normalize_path(value: Union[str, pathlib.Path], absolute: bool = False, expa
|
|
104
104
|
return value
|
105
105
|
|
106
106
|
|
107
|
-
def get_file_size(file: str) -> Optional[int]:
|
107
|
+
def get_file_size(file: str, raise_exception: bool = True) -> Optional[int]:
|
108
108
|
try:
|
109
109
|
return os.path.getsize(file) if isinstance(file, str) else None
|
110
110
|
except Exception:
|
111
|
+
if raise_exception is True:
|
112
|
+
raise
|
111
113
|
return None
|
112
114
|
|
113
115
|
|
114
|
-
def get_file_modified_datetime(file: str) -> Optional[datetime]:
|
116
|
+
def get_file_modified_datetime(file: str, raise_exception: bool = True) -> Optional[datetime]:
|
115
117
|
try:
|
116
118
|
return datetime.fromtimestamp(os.path.getmtime(file)) if isinstance(file, str) else None
|
117
119
|
except Exception:
|
120
|
+
if raise_exception is True:
|
121
|
+
raise
|
118
122
|
return None
|
119
123
|
|
120
124
|
|
121
|
-
def are_files_equal(filea: str, fileb: str) -> bool:
|
125
|
+
def are_files_equal(filea: str, fileb: str, raise_exception: bool = True) -> bool:
|
122
126
|
"""
|
123
127
|
Returns True iff the contents of the two given files are exactly the same.
|
124
128
|
"""
|
@@ -135,10 +139,12 @@ def are_files_equal(filea: str, fileb: str) -> bool:
|
|
135
139
|
break
|
136
140
|
return True
|
137
141
|
except Exception:
|
142
|
+
if raise_exception is True:
|
143
|
+
raise
|
138
144
|
return False
|
139
145
|
|
140
146
|
|
141
|
-
def compute_file_md5(file: str) -> str:
|
147
|
+
def compute_file_md5(file: str, raise_exception: bool = True) -> str:
|
142
148
|
"""
|
143
149
|
Returns the md5 checksum for the given file.
|
144
150
|
"""
|
@@ -151,10 +157,12 @@ def compute_file_md5(file: str) -> str:
|
|
151
157
|
md5.update(chunk)
|
152
158
|
return md5.hexdigest()
|
153
159
|
except Exception:
|
160
|
+
if raise_exception is True:
|
161
|
+
raise
|
154
162
|
return ""
|
155
163
|
|
156
164
|
|
157
|
-
def compute_file_etag(file: str) -> Optional[str]:
|
165
|
+
def compute_file_etag(file: str, raise_exception: bool = True) -> Optional[str]:
|
158
166
|
"""
|
159
167
|
Returns the AWS S3 "etag" for the given file; this value is md5-like but
|
160
168
|
not the same as a normal md5. We use this to compare that a file in S3
|
@@ -164,6 +172,8 @@ def compute_file_etag(file: str) -> Optional[str]:
|
|
164
172
|
with io.open(file, "rb") as f:
|
165
173
|
return _compute_file_etag(f)
|
166
174
|
except Exception:
|
175
|
+
if raise_exception is True:
|
176
|
+
raise
|
167
177
|
return None
|
168
178
|
|
169
179
|
|
dcicutils/http_utils.py
CHANGED
@@ -8,24 +8,32 @@ from dcicutils.tmpfile_utils import temporary_file
|
|
8
8
|
def download(url: str, suffix: Optional[str] = None, binary: bool = True,
|
9
9
|
progress: Optional[Callable] = None) -> Optional[str]:
|
10
10
|
"""
|
11
|
-
Context manager to
|
12
|
-
path to it. An optional file suffix may be specified
|
13
|
-
|
11
|
+
Context manager to download the given URL into a temporary file and yields the file
|
12
|
+
path to it. An optional file suffix may be specified for this temporary file name.
|
13
|
+
Defaults to binary file mode; if not desired then pass False as the binary argument.
|
14
14
|
"""
|
15
|
-
if not callable(progress):
|
16
|
-
progress = None
|
17
15
|
with temporary_file(suffix=suffix) as file:
|
18
|
-
|
19
|
-
if progress:
|
20
|
-
nbytes = 0
|
21
|
-
nbytes_total = None
|
22
|
-
if isinstance(content_length := response.headers.get("Content-Length"), str) and content_length.isdigit():
|
23
|
-
nbytes_total = int(content_length)
|
24
|
-
with open(file, "wb" if binary is True else "w") as f:
|
25
|
-
for chunk in response.iter_content(chunk_size=8192):
|
26
|
-
if chunk:
|
27
|
-
f.write(chunk)
|
28
|
-
if progress:
|
29
|
-
nbytes += len(chunk)
|
30
|
-
progress(nbytes, nbytes_total)
|
16
|
+
download_to(url, file, binary=binary, progress=progress)
|
31
17
|
yield file
|
18
|
+
|
19
|
+
|
20
|
+
def download_to(url: str, file: str, binary: bool = True, progress: Optional[Callable] = None) -> None:
|
21
|
+
"""
|
22
|
+
Download the given URL into the given file. Defaults to binary
|
23
|
+
file mode; if not desired then pass False as the binary argument.
|
24
|
+
"""
|
25
|
+
if not callable(progress):
|
26
|
+
progress = None
|
27
|
+
response = requests.get(url, stream=True)
|
28
|
+
if progress:
|
29
|
+
nbytes = 0
|
30
|
+
nbytes_total = None
|
31
|
+
if isinstance(content_length := response.headers.get("Content-Length"), str) and content_length.isdigit():
|
32
|
+
nbytes_total = int(content_length)
|
33
|
+
with open(file, "wb" if binary is True else "w") as f:
|
34
|
+
for chunk in response.iter_content(chunk_size=8192):
|
35
|
+
if chunk:
|
36
|
+
f.write(chunk)
|
37
|
+
if progress:
|
38
|
+
nbytes += len(chunk)
|
39
|
+
progress(nbytes, nbytes_total)
|
@@ -28,10 +28,10 @@ dcicutils/es_utils.py,sha256=ZksLh5ei7kRUfiFltk8sd2ZSfh15twbstrMzBr8HNw4,7541
|
|
28
28
|
dcicutils/exceptions.py,sha256=4giQGtpak-omQv7BP6Ckeu91XK5fnDosC8gfdmN_ccA,9931
|
29
29
|
dcicutils/ff_mocks.py,sha256=6RKS4eUiu_Wl8yP_8V0CaV75w4ZdWxdCuL1CVlnMrek,36918
|
30
30
|
dcicutils/ff_utils.py,sha256=oIhuZPnGtfwj6bWyCc1u23JbMB_6InPp01ZqUOljd8M,73123
|
31
|
-
dcicutils/file_utils.py,sha256=
|
31
|
+
dcicutils/file_utils.py,sha256=sAWOMzP-6B5WcudFhsEigW_ow20Tvzn-KMMbSUmejN0,10390
|
32
32
|
dcicutils/function_cache_decorator.py,sha256=XMyiEGODVr2WoAQ68vcoX_9_Xb9p8pZXdXl7keU8i2g,10026
|
33
33
|
dcicutils/glacier_utils.py,sha256=Q4CVXsZCbP-SoZIsZ5NMcawDfelOLzbQnIlQn-GdlTo,34149
|
34
|
-
dcicutils/http_utils.py,sha256=
|
34
|
+
dcicutils/http_utils.py,sha256=tNfH5JA-OwbQKEvD5HPJ3lcp2TSIZ4rnl__4d4JO8Gw,1583
|
35
35
|
dcicutils/jh_utils.py,sha256=Gpsxb9XEzggF_-Eq3ukjKvTnuyb9V1SCSUXkXsES4Kg,11502
|
36
36
|
dcicutils/kibana/dashboards.json,sha256=wHMB_mpJ8OaYhRRgvpZuihaB2lmSF64ADt_8hkBWgQg,16225
|
37
37
|
dcicutils/kibana/readme.md,sha256=3KmHF9FH6A6xwYsNxRFLw27q0XzHYnjZOlYUnn3VkQQ,2164
|
@@ -73,8 +73,8 @@ dcicutils/trace_utils.py,sha256=g8kwV4ebEy5kXW6oOrEAUsurBcCROvwtZqz9fczsGRE,1769
|
|
73
73
|
dcicutils/validation_utils.py,sha256=cMZIU2cY98FYtzK52z5WUYck7urH6JcqOuz9jkXpqzg,14797
|
74
74
|
dcicutils/variant_utils.py,sha256=2H9azNx3xAj-MySg-uZ2SFqbWs4kZvf61JnK6b-h4Qw,4343
|
75
75
|
dcicutils/zip_utils.py,sha256=_Y9EmL3D2dUZhxucxHvrtmmlbZmK4FpSsHEb7rGSJLU,3265
|
76
|
-
dcicutils-8.8.4.
|
77
|
-
dcicutils-8.8.4.
|
78
|
-
dcicutils-8.8.4.
|
79
|
-
dcicutils-8.8.4.
|
80
|
-
dcicutils-8.8.4.
|
76
|
+
dcicutils-8.8.4.1b26.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
|
77
|
+
dcicutils-8.8.4.1b26.dist-info/METADATA,sha256=sCYQvCovlXbMTOECG1ptQS_QUk5mld085Pke5YzLrEk,3440
|
78
|
+
dcicutils-8.8.4.1b26.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
|
79
|
+
dcicutils-8.8.4.1b26.dist-info/entry_points.txt,sha256=51Q4F_2V10L0282W7HFjP4jdzW4K8lnWDARJQVFy_hw,270
|
80
|
+
dcicutils-8.8.4.1b26.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|