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
         
     |