dcicutils 8.8.4.1b24__py3-none-any.whl → 8.8.4.1b27__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 +20 -7
- dcicutils/http_utils.py +26 -18
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b27.dist-info}/METADATA +1 -1
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b27.dist-info}/RECORD +7 -7
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b27.dist-info}/LICENSE.txt +0 -0
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b27.dist-info}/WHEEL +0 -0
- {dcicutils-8.8.4.1b24.dist-info → dcicutils-8.8.4.1b27.dist-info}/entry_points.txt +0 -0
dcicutils/file_utils.py
CHANGED
@@ -97,28 +97,35 @@ def normalize_path(value: Union[str, pathlib.Path], absolute: bool = False, expa
|
|
97
97
|
return ""
|
98
98
|
if expand_home is True:
|
99
99
|
value = os.path.expanduser(value)
|
100
|
-
elif (expand_home is False) and (os.name == "posix")
|
101
|
-
value
|
100
|
+
elif (expand_home is False) and (os.name == "posix"):
|
101
|
+
if value.startswith(home := HOME_DIRECTORY + os.sep):
|
102
|
+
value = "~/" + value[len(home):]
|
103
|
+
elif value == HOME_DIRECTORY:
|
104
|
+
value = "~"
|
102
105
|
if absolute is True:
|
103
106
|
value = os.path.abspath(value)
|
104
107
|
return value
|
105
108
|
|
106
109
|
|
107
|
-
def get_file_size(file: str) -> Optional[int]:
|
110
|
+
def get_file_size(file: str, raise_exception: bool = True) -> Optional[int]:
|
108
111
|
try:
|
109
112
|
return os.path.getsize(file) if isinstance(file, str) else None
|
110
113
|
except Exception:
|
114
|
+
if raise_exception is True:
|
115
|
+
raise
|
111
116
|
return None
|
112
117
|
|
113
118
|
|
114
|
-
def get_file_modified_datetime(file: str) -> Optional[datetime]:
|
119
|
+
def get_file_modified_datetime(file: str, raise_exception: bool = True) -> Optional[datetime]:
|
115
120
|
try:
|
116
121
|
return datetime.fromtimestamp(os.path.getmtime(file)) if isinstance(file, str) else None
|
117
122
|
except Exception:
|
123
|
+
if raise_exception is True:
|
124
|
+
raise
|
118
125
|
return None
|
119
126
|
|
120
127
|
|
121
|
-
def are_files_equal(filea: str, fileb: str) -> bool:
|
128
|
+
def are_files_equal(filea: str, fileb: str, raise_exception: bool = True) -> bool:
|
122
129
|
"""
|
123
130
|
Returns True iff the contents of the two given files are exactly the same.
|
124
131
|
"""
|
@@ -135,10 +142,12 @@ def are_files_equal(filea: str, fileb: str) -> bool:
|
|
135
142
|
break
|
136
143
|
return True
|
137
144
|
except Exception:
|
145
|
+
if raise_exception is True:
|
146
|
+
raise
|
138
147
|
return False
|
139
148
|
|
140
149
|
|
141
|
-
def compute_file_md5(file: str) -> str:
|
150
|
+
def compute_file_md5(file: str, raise_exception: bool = True) -> str:
|
142
151
|
"""
|
143
152
|
Returns the md5 checksum for the given file.
|
144
153
|
"""
|
@@ -151,10 +160,12 @@ def compute_file_md5(file: str) -> str:
|
|
151
160
|
md5.update(chunk)
|
152
161
|
return md5.hexdigest()
|
153
162
|
except Exception:
|
163
|
+
if raise_exception is True:
|
164
|
+
raise
|
154
165
|
return ""
|
155
166
|
|
156
167
|
|
157
|
-
def compute_file_etag(file: str) -> Optional[str]:
|
168
|
+
def compute_file_etag(file: str, raise_exception: bool = True) -> Optional[str]:
|
158
169
|
"""
|
159
170
|
Returns the AWS S3 "etag" for the given file; this value is md5-like but
|
160
171
|
not the same as a normal md5. We use this to compare that a file in S3
|
@@ -164,6 +175,8 @@ def compute_file_etag(file: str) -> Optional[str]:
|
|
164
175
|
with io.open(file, "rb") as f:
|
165
176
|
return _compute_file_etag(f)
|
166
177
|
except Exception:
|
178
|
+
if raise_exception is True:
|
179
|
+
raise
|
167
180
|
return None
|
168
181
|
|
169
182
|
|
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=9JRyXciF7AoDKWRBryglsMg5f3VGL_ymg_hSMnxUVKk,10464
|
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.1b27.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
|
77
|
+
dcicutils-8.8.4.1b27.dist-info/METADATA,sha256=j8Dc5eU279IAbIgHb1k4afO4eElDYIPF7zGZ9k9Dppo,3440
|
78
|
+
dcicutils-8.8.4.1b27.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
|
79
|
+
dcicutils-8.8.4.1b27.dist-info/entry_points.txt,sha256=51Q4F_2V10L0282W7HFjP4jdzW4K8lnWDARJQVFy_hw,270
|
80
|
+
dcicutils-8.8.4.1b27.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|