dcicutils 8.8.4.1b23__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 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 ownload the given URL into a temporary file and yields the file
12
- path to it. An optional file suffix may be specified. Defaults to binary file mode;
13
- if this is not desired then pass False as the binary argument.
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
- response = requests.get(url, stream=True)
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dcicutils
3
- Version: 8.8.4.1b23
3
+ Version: 8.8.4.1b26
4
4
  Summary: Utility package for interacting with the 4DN Data Portal and other 4DN resources
5
5
  Home-page: https://github.com/4dn-dcic/utils
6
6
  License: MIT
@@ -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=WKEe985ioa9QNHVllRp8gxaKxB7hAnN-anKnz4CPfv4,9970
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=Je5ErNjR5e6lfSXGRncK_lcR_-zP38PIpmHjApy9Wi4,1289
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.1b23.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
77
- dcicutils-8.8.4.1b23.dist-info/METADATA,sha256=kaEkCQSNE1Lw-BaMzECoGi4Qs299k0UQEQdbcAAyGvc,3440
78
- dcicutils-8.8.4.1b23.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
79
- dcicutils-8.8.4.1b23.dist-info/entry_points.txt,sha256=51Q4F_2V10L0282W7HFjP4jdzW4K8lnWDARJQVFy_hw,270
80
- dcicutils-8.8.4.1b23.dist-info/RECORD,,
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,,