metaflow 2.13__py2.py3-none-any.whl → 2.13.1__py2.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.
- metaflow/metadata_provider/heartbeat.py +23 -8
- metaflow/metaflow_config.py +2 -0
- metaflow/plugins/argo/argo_client.py +0 -2
- metaflow/plugins/argo/argo_workflows.py +86 -104
- metaflow/plugins/argo/argo_workflows_cli.py +0 -1
- metaflow/plugins/argo/argo_workflows_decorator.py +2 -4
- metaflow/plugins/argo/jobset_input_paths.py +0 -1
- metaflow/plugins/aws/aws_utils.py +6 -1
- metaflow/plugins/aws/batch/batch_client.py +1 -3
- metaflow/plugins/aws/batch/batch_decorator.py +11 -11
- metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -3
- metaflow/plugins/aws/step_functions/production_token.py +1 -1
- metaflow/plugins/aws/step_functions/step_functions.py +1 -1
- metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -1
- metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -1
- metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -1
- metaflow/plugins/kubernetes/kube_utils.py +55 -1
- metaflow/plugins/kubernetes/kubernetes.py +33 -80
- metaflow/plugins/kubernetes/kubernetes_cli.py +22 -5
- metaflow/plugins/kubernetes/kubernetes_decorator.py +49 -2
- metaflow/plugins/kubernetes/kubernetes_job.py +3 -6
- metaflow/plugins/kubernetes/kubernetes_jobsets.py +22 -5
- metaflow/plugins/pypi/bootstrap.py +87 -54
- metaflow/plugins/pypi/conda_environment.py +7 -6
- metaflow/plugins/pypi/micromamba.py +35 -21
- metaflow/plugins/pypi/pip.py +2 -4
- metaflow/plugins/pypi/utils.py +4 -2
- metaflow/version.py +1 -1
- {metaflow-2.13.dist-info → metaflow-2.13.1.dist-info}/METADATA +2 -2
- {metaflow-2.13.dist-info → metaflow-2.13.1.dist-info}/RECORD +34 -34
- {metaflow-2.13.dist-info → metaflow-2.13.1.dist-info}/WHEEL +1 -1
- {metaflow-2.13.dist-info → metaflow-2.13.1.dist-info}/LICENSE +0 -0
- {metaflow-2.13.dist-info → metaflow-2.13.1.dist-info}/entry_points.txt +0 -0
- {metaflow-2.13.dist-info → metaflow-2.13.1.dist-info}/top_level.txt +0 -0
| @@ -8,12 +8,14 @@ import subprocess | |
| 8 8 | 
             
            import sys
         | 
| 9 9 | 
             
            import tarfile
         | 
| 10 10 | 
             
            import time
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            import  | 
| 13 | 
            -
             | 
| 11 | 
            +
            from urllib.error import URLError
         | 
| 12 | 
            +
            from urllib.request import urlopen
         | 
| 14 13 | 
             
            from metaflow.metaflow_config import DATASTORE_LOCAL_DIR
         | 
| 15 14 | 
             
            from metaflow.plugins import DATASTORES
         | 
| 15 | 
            +
            from metaflow.plugins.pypi.utils import MICROMAMBA_MIRROR_URL, MICROMAMBA_URL
         | 
| 16 16 | 
             
            from metaflow.util import which
         | 
| 17 | 
            +
            from urllib.request import Request
         | 
| 18 | 
            +
            import warnings
         | 
| 17 19 |  | 
| 18 20 | 
             
            from . import MAGIC_FILE, _datastore_packageroot
         | 
| 19 21 |  | 
| @@ -32,11 +34,6 @@ def timer(func): | |
| 32 34 |  | 
| 33 35 |  | 
| 34 36 | 
             
            if __name__ == "__main__":
         | 
| 35 | 
            -
                if len(sys.argv) != 5:
         | 
| 36 | 
            -
                    print("Usage: bootstrap.py <flow_name> <id> <datastore_type> <architecture>")
         | 
| 37 | 
            -
                    sys.exit(1)
         | 
| 38 | 
            -
                _, flow_name, id_, datastore_type, architecture = sys.argv
         | 
| 39 | 
            -
             | 
| 40 37 | 
             
                # TODO: Detect architecture on the fly when dealing with arm architectures.
         | 
| 41 38 | 
             
                # ARCH=$(uname -m)
         | 
| 42 39 | 
             
                # OS=$(uname)
         | 
| @@ -61,30 +58,6 @@ if __name__ == "__main__": | |
| 61 58 | 
             
                #     fi
         | 
| 62 59 | 
             
                # fi
         | 
| 63 60 |  | 
| 64 | 
            -
                prefix = os.path.join(os.getcwd(), architecture, id_)
         | 
| 65 | 
            -
                pkgs_dir = os.path.join(os.getcwd(), ".pkgs")
         | 
| 66 | 
            -
                conda_pkgs_dir = os.path.join(pkgs_dir, "conda")
         | 
| 67 | 
            -
                pypi_pkgs_dir = os.path.join(pkgs_dir, "pypi")
         | 
| 68 | 
            -
                manifest_dir = os.path.join(os.getcwd(), DATASTORE_LOCAL_DIR, flow_name)
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                datastores = [d for d in DATASTORES if d.TYPE == datastore_type]
         | 
| 71 | 
            -
                if not datastores:
         | 
| 72 | 
            -
                    print(f"No datastore found for type: {datastore_type}")
         | 
| 73 | 
            -
                    sys.exit(1)
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                storage = datastores[0](
         | 
| 76 | 
            -
                    _datastore_packageroot(datastores[0], lambda *args, **kwargs: None)
         | 
| 77 | 
            -
                )
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                # Move MAGIC_FILE inside local datastore.
         | 
| 80 | 
            -
                os.makedirs(manifest_dir, exist_ok=True)
         | 
| 81 | 
            -
                shutil.move(
         | 
| 82 | 
            -
                    os.path.join(os.getcwd(), MAGIC_FILE),
         | 
| 83 | 
            -
                    os.path.join(manifest_dir, MAGIC_FILE),
         | 
| 84 | 
            -
                )
         | 
| 85 | 
            -
                with open(os.path.join(manifest_dir, MAGIC_FILE)) as f:
         | 
| 86 | 
            -
                    env = json.load(f)[id_][architecture]
         | 
| 87 | 
            -
             | 
| 88 61 | 
             
                def run_cmd(cmd):
         | 
| 89 62 | 
             
                    result = subprocess.run(
         | 
| 90 63 | 
             
                        cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
         | 
| @@ -107,29 +80,55 @@ if __name__ == "__main__": | |
| 107 80 | 
             
                        return micromamba_path
         | 
| 108 81 |  | 
| 109 82 | 
             
                    # Download and extract in one go
         | 
| 110 | 
            -
                     | 
| 111 | 
            -
                     | 
| 83 | 
            +
                    url = MICROMAMBA_URL.format(platform=architecture, version="2.0.4")
         | 
| 84 | 
            +
                    mirror_url = MICROMAMBA_MIRROR_URL.format(
         | 
| 85 | 
            +
                        platform=architecture, version="2.0.4"
         | 
| 86 | 
            +
                    )
         | 
| 112 87 |  | 
| 113 88 | 
             
                    # Prepare directory once
         | 
| 114 89 | 
             
                    os.makedirs(os.path.dirname(micromamba_path), exist_ok=True)
         | 
| 115 90 |  | 
| 116 | 
            -
                    #  | 
| 117 | 
            -
                     | 
| 118 | 
            -
                         | 
| 119 | 
            -
                             | 
| 120 | 
            -
             | 
| 121 | 
            -
                             | 
| 122 | 
            -
             | 
| 123 | 
            -
                        decompressor = bz2.BZ2Decompressor()
         | 
| 124 | 
            -
             | 
| 125 | 
            -
                        # Process in memory without temporary files
         | 
| 126 | 
            -
                        tar_content = decompressor.decompress(response.raw.read())
         | 
| 91 | 
            +
                    # Download and decompress in one go
         | 
| 92 | 
            +
                    def _download_and_extract(url):
         | 
| 93 | 
            +
                        headers = {
         | 
| 94 | 
            +
                            "Accept-Encoding": "gzip, deflate, br",
         | 
| 95 | 
            +
                            "Connection": "keep-alive",
         | 
| 96 | 
            +
                            "User-Agent": "python-urllib",
         | 
| 97 | 
            +
                        }
         | 
| 127 98 |  | 
| 128 | 
            -
                         | 
| 129 | 
            -
             | 
| 130 | 
            -
                             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 99 | 
            +
                        max_retries = 3
         | 
| 100 | 
            +
                        for attempt in range(max_retries):
         | 
| 101 | 
            +
                            try:
         | 
| 102 | 
            +
                                req = Request(url, headers=headers)
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                                with urlopen(req) as response:
         | 
| 105 | 
            +
                                    decompressor = bz2.BZ2Decompressor()
         | 
| 106 | 
            +
                                    with warnings.catch_warnings():
         | 
| 107 | 
            +
                                        warnings.filterwarnings(
         | 
| 108 | 
            +
                                            "ignore", category=DeprecationWarning
         | 
| 109 | 
            +
                                        )
         | 
| 110 | 
            +
                                        with tarfile.open(
         | 
| 111 | 
            +
                                            fileobj=io.BytesIO(
         | 
| 112 | 
            +
                                                decompressor.decompress(response.read())
         | 
| 113 | 
            +
                                            ),
         | 
| 114 | 
            +
                                            mode="r:",
         | 
| 115 | 
            +
                                        ) as tar:
         | 
| 116 | 
            +
                                            member = tar.getmember("bin/micromamba")
         | 
| 117 | 
            +
                                            tar.extract(member, micromamba_dir)
         | 
| 118 | 
            +
                                break
         | 
| 119 | 
            +
                            except (URLError, IOError) as e:
         | 
| 120 | 
            +
                                if attempt == max_retries - 1:
         | 
| 121 | 
            +
                                    raise Exception(
         | 
| 122 | 
            +
                                        f"Failed to download micromamba after {max_retries} attempts: {e}"
         | 
| 123 | 
            +
                                    )
         | 
| 124 | 
            +
                                time.sleep(2**attempt)
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                    try:
         | 
| 127 | 
            +
                        # first try from mirror
         | 
| 128 | 
            +
                        _download_and_extract(mirror_url)
         | 
| 129 | 
            +
                    except Exception:
         | 
| 130 | 
            +
                        # download from mirror failed, try official source before failing.
         | 
| 131 | 
            +
                        _download_and_extract(url)
         | 
| 133 132 |  | 
| 134 133 | 
             
                    # Set executable permission
         | 
| 135 134 | 
             
                    os.chmod(micromamba_path, 0o755)
         | 
| @@ -140,7 +139,6 @@ if __name__ == "__main__": | |
| 140 139 |  | 
| 141 140 | 
             
                @timer
         | 
| 142 141 | 
             
                def download_conda_packages(storage, packages, dest_dir):
         | 
| 143 | 
            -
             | 
| 144 142 | 
             
                    def process_conda_package(args):
         | 
| 145 143 | 
             
                        # Ensure that conda packages go into architecture specific folders.
         | 
| 146 144 | 
             
                        # The path looks like REPO/CHANNEL/CONDA_SUBDIR/PACKAGE. We trick
         | 
| @@ -169,7 +167,6 @@ if __name__ == "__main__": | |
| 169 167 |  | 
| 170 168 | 
             
                @timer
         | 
| 171 169 | 
             
                def download_pypi_packages(storage, packages, dest_dir):
         | 
| 172 | 
            -
             | 
| 173 170 | 
             
                    def process_pypi_package(args):
         | 
| 174 171 | 
             
                        key, tmpfile, dest_dir = args
         | 
| 175 172 | 
             
                        dest = os.path.join(dest_dir, os.path.basename(key))
         | 
| @@ -208,7 +205,6 @@ if __name__ == "__main__": | |
| 208 205 |  | 
| 209 206 | 
             
                @timer
         | 
| 210 207 | 
             
                def install_pypi_packages(prefix, pypi_pkgs_dir):
         | 
| 211 | 
            -
             | 
| 212 208 | 
             
                    cmd = f"""set -e;
         | 
| 213 209 | 
             
                        export PATH=$PATH:$(pwd)/micromamba;
         | 
| 214 210 | 
             
                        export CONDA_PKGS_DIRS=$(pwd)/micromamba/pkgs;
         | 
| @@ -272,4 +268,41 @@ if __name__ == "__main__": | |
| 272 268 | 
             
                            # wait for conda environment to be created
         | 
| 273 269 | 
             
                            futures["conda_env"].result()
         | 
| 274 270 |  | 
| 275 | 
            -
                 | 
| 271 | 
            +
                if len(sys.argv) != 5:
         | 
| 272 | 
            +
                    print("Usage: bootstrap.py <flow_name> <id> <datastore_type> <architecture>")
         | 
| 273 | 
            +
                    sys.exit(1)
         | 
| 274 | 
            +
             | 
| 275 | 
            +
                try:
         | 
| 276 | 
            +
                    _, flow_name, id_, datastore_type, architecture = sys.argv
         | 
| 277 | 
            +
             | 
| 278 | 
            +
                    prefix = os.path.join(os.getcwd(), architecture, id_)
         | 
| 279 | 
            +
                    pkgs_dir = os.path.join(os.getcwd(), ".pkgs")
         | 
| 280 | 
            +
                    conda_pkgs_dir = os.path.join(pkgs_dir, "conda")
         | 
| 281 | 
            +
                    pypi_pkgs_dir = os.path.join(pkgs_dir, "pypi")
         | 
| 282 | 
            +
                    manifest_dir = os.path.join(os.getcwd(), DATASTORE_LOCAL_DIR, flow_name)
         | 
| 283 | 
            +
             | 
| 284 | 
            +
                    datastores = [d for d in DATASTORES if d.TYPE == datastore_type]
         | 
| 285 | 
            +
                    if not datastores:
         | 
| 286 | 
            +
                        print(f"No datastore found for type: {datastore_type}")
         | 
| 287 | 
            +
                        sys.exit(1)
         | 
| 288 | 
            +
             | 
| 289 | 
            +
                    storage = datastores[0](
         | 
| 290 | 
            +
                        _datastore_packageroot(datastores[0], lambda *args, **kwargs: None)
         | 
| 291 | 
            +
                    )
         | 
| 292 | 
            +
             | 
| 293 | 
            +
                    # Move MAGIC_FILE inside local datastore.
         | 
| 294 | 
            +
                    os.makedirs(manifest_dir, exist_ok=True)
         | 
| 295 | 
            +
                    shutil.move(
         | 
| 296 | 
            +
                        os.path.join(os.getcwd(), MAGIC_FILE),
         | 
| 297 | 
            +
                        os.path.join(manifest_dir, MAGIC_FILE),
         | 
| 298 | 
            +
                    )
         | 
| 299 | 
            +
                    with open(os.path.join(manifest_dir, MAGIC_FILE)) as f:
         | 
| 300 | 
            +
                        env = json.load(f)[id_][architecture]
         | 
| 301 | 
            +
             | 
| 302 | 
            +
                    setup_environment(
         | 
| 303 | 
            +
                        architecture, storage, env, prefix, conda_pkgs_dir, pypi_pkgs_dir
         | 
| 304 | 
            +
                    )
         | 
| 305 | 
            +
             | 
| 306 | 
            +
                except Exception as e:
         | 
| 307 | 
            +
                    print(f"Error: {str(e)}", file=sys.stderr)
         | 
| 308 | 
            +
                    sys.exit(1)
         | 
| @@ -7,20 +7,15 @@ import json | |
| 7 7 | 
             
            import os
         | 
| 8 8 | 
             
            import tarfile
         | 
| 9 9 | 
             
            import threading
         | 
| 10 | 
            -
            import time
         | 
| 11 10 | 
             
            from concurrent.futures import ThreadPoolExecutor, as_completed
         | 
| 12 11 | 
             
            from functools import wraps
         | 
| 13 12 | 
             
            from hashlib import sha256
         | 
| 14 13 | 
             
            from io import BufferedIOBase, BytesIO
         | 
| 15 | 
            -
            from itertools import chain
         | 
| 16 14 | 
             
            from urllib.parse import unquote, urlparse
         | 
| 17 15 |  | 
| 18 | 
            -
            import requests
         | 
| 19 | 
            -
             | 
| 20 16 | 
             
            from metaflow.exception import MetaflowException
         | 
| 21 17 | 
             
            from metaflow.metaflow_config import get_pinned_conda_libs
         | 
| 22 18 | 
             
            from metaflow.metaflow_environment import MetaflowEnvironment
         | 
| 23 | 
            -
            from metaflow.metaflow_profile import profile
         | 
| 24 19 |  | 
| 25 20 | 
             
            from . import MAGIC_FILE, _datastore_packageroot
         | 
| 26 21 | 
             
            from .utils import conda_platform
         | 
| @@ -498,6 +493,7 @@ class LazyOpen(BufferedIOBase): | |
| 498 493 | 
             
                    self._file = None
         | 
| 499 494 | 
             
                    self._buffer = None
         | 
| 500 495 | 
             
                    self._position = 0
         | 
| 496 | 
            +
                    self.requests = None
         | 
| 501 497 |  | 
| 502 498 | 
             
                def _ensure_file(self):
         | 
| 503 499 | 
             
                    if not self._file:
         | 
| @@ -514,8 +510,13 @@ class LazyOpen(BufferedIOBase): | |
| 514 510 | 
             
                            raise ValueError("Both filename and url are missing")
         | 
| 515 511 |  | 
| 516 512 | 
             
                def _download_to_buffer(self):
         | 
| 513 | 
            +
                    if self.requests is None:
         | 
| 514 | 
            +
                        # TODO: Remove dependency on requests
         | 
| 515 | 
            +
                        import requests
         | 
| 516 | 
            +
             | 
| 517 | 
            +
                        self.requests = requests
         | 
| 517 518 | 
             
                    # TODO: Stream it in chunks?
         | 
| 518 | 
            -
                    response = requests.get(self.url, stream=True)
         | 
| 519 | 
            +
                    response = self.requests.get(self.url, stream=True)
         | 
| 519 520 | 
             
                    response.raise_for_status()
         | 
| 520 521 | 
             
                    return response.content
         | 
| 521 522 |  | 
| @@ -8,7 +8,7 @@ import time | |
| 8 8 | 
             
            from metaflow.exception import MetaflowException
         | 
| 9 9 | 
             
            from metaflow.util import which
         | 
| 10 10 |  | 
| 11 | 
            -
            from .utils import conda_platform
         | 
| 11 | 
            +
            from .utils import MICROMAMBA_MIRROR_URL, MICROMAMBA_URL, conda_platform
         | 
| 12 12 |  | 
| 13 13 |  | 
| 14 14 | 
             
            class MicromambaException(MetaflowException):
         | 
| @@ -323,7 +323,7 @@ class Micromamba(object): | |
| 323 323 | 
             
                                    stderr="\n".join(err),
         | 
| 324 324 | 
             
                                )
         | 
| 325 325 | 
             
                            )
         | 
| 326 | 
            -
                        except (TypeError, ValueError) | 
| 326 | 
            +
                        except (TypeError, ValueError):
         | 
| 327 327 | 
             
                            pass
         | 
| 328 328 | 
             
                        raise MicromambaException(
         | 
| 329 329 | 
             
                            msg.format(
         | 
| @@ -339,23 +339,37 @@ def _install_micromamba(installation_location): | |
| 339 339 | 
             
                # Unfortunately no 32bit binaries are available for micromamba, which ideally
         | 
| 340 340 | 
             
                # shouldn't be much of a problem in today's world.
         | 
| 341 341 | 
             
                platform = conda_platform()
         | 
| 342 | 
            -
                 | 
| 343 | 
            -
             | 
| 344 | 
            -
             | 
| 345 | 
            -
                    # requires bzip2
         | 
| 346 | 
            -
                    result = subprocess.Popen(
         | 
| 347 | 
            -
                        f"curl -Ls https://micro.mamba.pm/api/micromamba/{platform}/1.5.7 | tar -xvj -C {installation_location} bin/micromamba",
         | 
| 348 | 
            -
                        shell=True,
         | 
| 349 | 
            -
                        stderr=subprocess.PIPE,
         | 
| 350 | 
            -
                        stdout=subprocess.PIPE,
         | 
| 351 | 
            -
                    )
         | 
| 352 | 
            -
                    _, err = result.communicate()
         | 
| 353 | 
            -
                    if result.returncode != 0:
         | 
| 354 | 
            -
                        raise MicromambaException(
         | 
| 355 | 
            -
                            f"Micromamba installation '{result.args}' failed:\n{err.decode()}"
         | 
| 356 | 
            -
                        )
         | 
| 342 | 
            +
                url = MICROMAMBA_URL.format(platform=platform, version="1.5.7")
         | 
| 343 | 
            +
                mirror_url = MICROMAMBA_MIRROR_URL.format(platform=platform, version="1.5.7")
         | 
| 344 | 
            +
                os.makedirs(installation_location, exist_ok=True)
         | 
| 357 345 |  | 
| 358 | 
            -
                 | 
| 359 | 
            -
                     | 
| 360 | 
            -
             | 
| 361 | 
            -
             | 
| 346 | 
            +
                def _download_and_extract(url):
         | 
| 347 | 
            +
                    max_retries = 3
         | 
| 348 | 
            +
                    for attempt in range(max_retries):
         | 
| 349 | 
            +
                        try:
         | 
| 350 | 
            +
                            # https://mamba.readthedocs.io/en/latest/micromamba-installation.html#manual-installation
         | 
| 351 | 
            +
                            # requires bzip2
         | 
| 352 | 
            +
                            result = subprocess.Popen(
         | 
| 353 | 
            +
                                f"curl -Ls {url} | tar -xvj -C {installation_location} bin/micromamba",
         | 
| 354 | 
            +
                                shell=True,
         | 
| 355 | 
            +
                                stderr=subprocess.PIPE,
         | 
| 356 | 
            +
                                stdout=subprocess.PIPE,
         | 
| 357 | 
            +
                            )
         | 
| 358 | 
            +
                            _, err = result.communicate()
         | 
| 359 | 
            +
                            if result.returncode != 0:
         | 
| 360 | 
            +
                                raise MicromambaException(
         | 
| 361 | 
            +
                                    f"Micromamba installation '{result.args}' failed:\n{err.decode()}"
         | 
| 362 | 
            +
                                )
         | 
| 363 | 
            +
                        except subprocess.CalledProcessError as e:
         | 
| 364 | 
            +
                            if attempt == max_retries - 1:
         | 
| 365 | 
            +
                                raise MicromambaException(
         | 
| 366 | 
            +
                                    "Micromamba installation failed:\n{}".format(e.stderr.decode())
         | 
| 367 | 
            +
                                )
         | 
| 368 | 
            +
                            time.sleep(2**attempt)
         | 
| 369 | 
            +
             | 
| 370 | 
            +
                try:
         | 
| 371 | 
            +
                    # prioritize downloading from mirror
         | 
| 372 | 
            +
                    _download_and_extract(mirror_url)
         | 
| 373 | 
            +
                except Exception:
         | 
| 374 | 
            +
                    # download from official source as a fallback
         | 
| 375 | 
            +
                    _download_and_extract(url)
         | 
    
        metaflow/plugins/pypi/pip.py
    CHANGED
    
    | @@ -4,7 +4,6 @@ import re | |
| 4 4 | 
             
            import shutil
         | 
| 5 5 | 
             
            import subprocess
         | 
| 6 6 | 
             
            import tempfile
         | 
| 7 | 
            -
            import time
         | 
| 8 7 | 
             
            from concurrent.futures import ThreadPoolExecutor
         | 
| 9 8 | 
             
            from itertools import chain, product
         | 
| 10 9 | 
             
            from urllib.parse import unquote
         | 
| @@ -107,9 +106,8 @@ class Pip(object): | |
| 107 106 | 
             
                        except PipPackageNotFound as ex:
         | 
| 108 107 | 
             
                            # pretty print package errors
         | 
| 109 108 | 
             
                            raise PipException(
         | 
| 110 | 
            -
                                " | 
| 111 | 
            -
                                " | 
| 112 | 
            -
                                "Note that ***@pypi*** does not currently support source distributions"
         | 
| 109 | 
            +
                                "Unable to find a binary distribution compatible with %s for %s.\n\n"
         | 
| 110 | 
            +
                                "Note: ***@pypi*** does not currently support source distributions"
         | 
| 113 111 | 
             
                                % (ex.package_spec, platform)
         | 
| 114 112 | 
             
                            )
         | 
| 115 113 |  | 
    
        metaflow/plugins/pypi/utils.py
    CHANGED
    
    | @@ -1,4 +1,3 @@ | |
| 1 | 
            -
            import os
         | 
| 2 1 | 
             
            import platform
         | 
| 3 2 | 
             
            import sys
         | 
| 4 3 |  | 
| @@ -17,10 +16,13 @@ else: | |
| 17 16 | 
             
                from metaflow._vendor.packaging import tags
         | 
| 18 17 | 
             
                from metaflow._vendor.packaging.utils import parse_wheel_filename
         | 
| 19 18 |  | 
| 20 | 
            -
            from urllib.parse import unquote | 
| 19 | 
            +
            from urllib.parse import unquote
         | 
| 21 20 |  | 
| 22 21 | 
             
            from metaflow.exception import MetaflowException
         | 
| 23 22 |  | 
| 23 | 
            +
            MICROMAMBA_URL = "https://micro.mamba.pm/api/micromamba/{platform}/{version}"
         | 
| 24 | 
            +
            MICROMAMBA_MIRROR_URL = "https://micromamba.outerbounds.sh/{platform}/{version}.tar.bz2"
         | 
| 25 | 
            +
             | 
| 24 26 |  | 
| 25 27 | 
             
            def conda_platform():
         | 
| 26 28 | 
             
                # Returns the conda platform for the Python interpreter
         | 
    
        metaflow/version.py
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            metaflow_version = "2.13"
         | 
| 1 | 
            +
            metaflow_version = "2.13.1"
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            Metadata-Version: 2.1
         | 
| 2 2 | 
             
            Name: metaflow
         | 
| 3 | 
            -
            Version: 2.13
         | 
| 3 | 
            +
            Version: 2.13.1
         | 
| 4 4 | 
             
            Summary: Metaflow: More Data Science, Less Engineering
         | 
| 5 5 | 
             
            Author: Metaflow Developers
         | 
| 6 6 | 
             
            Author-email: help@metaflow.org
         | 
| @@ -26,7 +26,7 @@ License-File: LICENSE | |
| 26 26 | 
             
            Requires-Dist: requests
         | 
| 27 27 | 
             
            Requires-Dist: boto3
         | 
| 28 28 | 
             
            Provides-Extra: stubs
         | 
| 29 | 
            -
            Requires-Dist: metaflow-stubs==2.13; extra == "stubs"
         | 
| 29 | 
            +
            Requires-Dist: metaflow-stubs==2.13.1; extra == "stubs"
         | 
| 30 30 |  | 
| 31 31 | 
             
            
         | 
| 32 32 |  | 
| @@ -16,7 +16,7 @@ metaflow/includefile.py,sha256=kWKDSlzVcRVNGG9PV5eB3o2ynrzqhVsfaLtkqjshn7Q,20948 | |
| 16 16 | 
             
            metaflow/info_file.py,sha256=wtf2_F0M6dgiUu74AFImM8lfy5RrUw5Yj7Rgs2swKRY,686
         | 
| 17 17 | 
             
            metaflow/integrations.py,sha256=LlsaoePRg03DjENnmLxZDYto3NwWc9z_PtU6nJxLldg,1480
         | 
| 18 18 | 
             
            metaflow/lint.py,sha256=x4p6tnRzYqNNniCGXyrUW0WuYfTUgnaOMRivxvnxask,11661
         | 
| 19 | 
            -
            metaflow/metaflow_config.py,sha256= | 
| 19 | 
            +
            metaflow/metaflow_config.py,sha256=erZeQ2v7sRufbcAVhT1EEFIt4p1TqRqvaVHot9Mz4CE,23373
         | 
| 20 20 | 
             
            metaflow/metaflow_config_funcs.py,sha256=5GlvoafV6SxykwfL8D12WXSfwjBN_NsyuKE_Q3gjGVE,6738
         | 
| 21 21 | 
             
            metaflow/metaflow_current.py,sha256=pfkXmkyHeMJhxIs6HBJNBEaBDpcl5kz9Wx5mW6F_3qo,7164
         | 
| 22 22 | 
             
            metaflow/metaflow_environment.py,sha256=rojFyGdyY56sN1HaEb1-0XX53Q3XPNnl0SaH-8xXZ8w,7987
         | 
| @@ -36,7 +36,7 @@ metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830 | |
| 36 36 | 
             
            metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
         | 
| 37 37 | 
             
            metaflow/util.py,sha256=hKjHl6NYJkKBSU2tzdVbddfOX1zWK73T4GCO42A0XB4,14666
         | 
| 38 38 | 
             
            metaflow/vendor.py,sha256=FchtA9tH22JM-eEtJ2c9FpUdMn8sSb1VHuQS56EcdZk,5139
         | 
| 39 | 
            -
            metaflow/version.py,sha256 | 
| 39 | 
            +
            metaflow/version.py,sha256=-WYqXIqtitaLCU4E6qut6c9z10BnV1o-zeTM3vpABxg,28
         | 
| 40 40 | 
             
            metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
         | 
| 41 41 | 
             
            metaflow/_vendor/typing_extensions.py,sha256=0nUs5p1A_UrZigrAVBoOEM6TxU37zzPDUtiij1ZwpNc,110417
         | 
| 42 42 | 
             
            metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
         | 
| @@ -141,7 +141,7 @@ metaflow/extension_support/cmd.py,sha256=hk8iBUUINqvKCDxInKgWpum8ThiRZtHSJP7qBAS | |
| 141 141 | 
             
            metaflow/extension_support/integrations.py,sha256=AWAh-AZ-vo9IxuAVEjGw3s8p_NMm2DKHYx10oC51gPU,5506
         | 
| 142 142 | 
             
            metaflow/extension_support/plugins.py,sha256=4JbcXOWosSBqXlj1VINI5rSJGSnKx2_u3lN4KQxH-hs,11227
         | 
| 143 143 | 
             
            metaflow/metadata_provider/__init__.py,sha256=FZNSnz26VB_m18DQG8mup6-Gfl7r1U6lRMljJBp3VAM,64
         | 
| 144 | 
            -
            metaflow/metadata_provider/heartbeat.py,sha256= | 
| 144 | 
            +
            metaflow/metadata_provider/heartbeat.py,sha256=VFGDuO8LryraqsxGVORt6HtyqDUzIYNY50W3DbvR4js,3102
         | 
| 145 145 | 
             
            metaflow/metadata_provider/metadata.py,sha256=4tmySlgQaoV-p9bHig7BjsEsqFRZWEOuwSLpODuKxjA,26169
         | 
| 146 146 | 
             
            metaflow/metadata_provider/util.py,sha256=lYoQKbqoTM1iZChgyVWN-gX-HyM9tt9bXEMJexY9XmM,1723
         | 
| 147 147 | 
             
            metaflow/mflog/__init__.py,sha256=9iMMn2xYB0oaDXXcInxa9AdDqeVBeiJeB3klnqGkyL0,5983
         | 
| @@ -179,38 +179,38 @@ metaflow/plugins/airflow/sensors/base_sensor.py,sha256=s-OQBfPWZ_T3wn96Ua59CCEj1 | |
| 179 179 | 
             
            metaflow/plugins/airflow/sensors/external_task_sensor.py,sha256=zhYlrZnXT20KW8-fVk0fCNtTyNiKJB5PMVASacu30r0,6034
         | 
| 180 180 | 
             
            metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqNA90nARrjjjEEk_x4,3275
         | 
| 181 181 | 
             
            metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 182 | 
            -
            metaflow/plugins/argo/argo_client.py,sha256= | 
| 182 | 
            +
            metaflow/plugins/argo/argo_client.py,sha256=PS_cYGnPw9h4X7TP_plObDH3clMw4reOsBLkkGPTd0Y,16282
         | 
| 183 183 | 
             
            metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
         | 
| 184 | 
            -
            metaflow/plugins/argo/argo_workflows.py,sha256= | 
| 185 | 
            -
            metaflow/plugins/argo/argo_workflows_cli.py,sha256= | 
| 186 | 
            -
            metaflow/plugins/argo/argo_workflows_decorator.py,sha256= | 
| 184 | 
            +
            metaflow/plugins/argo/argo_workflows.py,sha256=14f1w_vlO4F_WFR1_e-9TDlwKHCUDlP22EsSvG5qMQA,174919
         | 
| 185 | 
            +
            metaflow/plugins/argo/argo_workflows_cli.py,sha256=11_8l4IrtkwviKsijInTZPt7YK5TZzClREnw_Cf4D5o,36706
         | 
| 186 | 
            +
            metaflow/plugins/argo/argo_workflows_decorator.py,sha256=ogCSBmwsC2C3eusydrgjuAJd4qK18f1sI4jJwA4Fd-o,7800
         | 
| 187 187 | 
             
            metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
         | 
| 188 188 | 
             
            metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=bs0E8WJGQYXuwi6u0OiwTn_jkfeKb5DywCmuJHeRl8I,13949
         | 
| 189 189 | 
             
            metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
         | 
| 190 190 | 
             
            metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
         | 
| 191 | 
            -
            metaflow/plugins/argo/jobset_input_paths.py,sha256 | 
| 191 | 
            +
            metaflow/plugins/argo/jobset_input_paths.py,sha256=-h0E_e0w6FMiBUod9Rf_XOSCtZv_C0exacw4q1SfIfg,501
         | 
| 192 192 | 
             
            metaflow/plugins/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 193 193 | 
             
            metaflow/plugins/aws/aws_client.py,sha256=mO8UD6pxFaOnxDb3hTP3HB7Gqb_ZxoR-76LT683WHvI,4036
         | 
| 194 | 
            -
            metaflow/plugins/aws/aws_utils.py,sha256= | 
| 194 | 
            +
            metaflow/plugins/aws/aws_utils.py,sha256=kNd61C54Y3WxrL7KSjoKydRjBQ1p3exc9QXux-jZyDE,7510
         | 
| 195 195 | 
             
            metaflow/plugins/aws/batch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 196 196 | 
             
            metaflow/plugins/aws/batch/batch.py,sha256=e9ssahWM18GnipPK2sqYB-ztx9w7Eoo7YtWyEtufYxs,17787
         | 
| 197 197 | 
             
            metaflow/plugins/aws/batch/batch_cli.py,sha256=gVQMWBLeuqO3U3PhVJSHLwa-CNHsmW0Cvmv-K0C-DoA,11758
         | 
| 198 | 
            -
            metaflow/plugins/aws/batch/batch_client.py,sha256= | 
| 199 | 
            -
            metaflow/plugins/aws/batch/batch_decorator.py,sha256= | 
| 198 | 
            +
            metaflow/plugins/aws/batch/batch_client.py,sha256=J50RMEXeEXFe5RqNUM1HN22BuDQFYFVQ4FSMOK55VWY,28798
         | 
| 199 | 
            +
            metaflow/plugins/aws/batch/batch_decorator.py,sha256=zRq0jF-FlzZsvv-ZKCsmSzUFIaflb1dLmEtkoPStNA4,17525
         | 
| 200 200 | 
             
            metaflow/plugins/aws/secrets_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 201 201 | 
             
            metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py,sha256=bBrGw4gRcKX9SLD8iKqPm_S_Zw5Y6F8AjxP6jPbkPpI,8136
         | 
| 202 202 | 
             
            metaflow/plugins/aws/step_functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 203 | 
            -
            metaflow/plugins/aws/step_functions/dynamo_db_client.py,sha256= | 
| 203 | 
            +
            metaflow/plugins/aws/step_functions/dynamo_db_client.py,sha256=nxnf35SiHcTS3aCm_4uAm9olCCPkWdauXgKBdVzZHrA,2300
         | 
| 204 204 | 
             
            metaflow/plugins/aws/step_functions/event_bridge_client.py,sha256=U9-tqKdih4KR-ZDRhFc-jHmYIcHgpS4swfgtTxNMB94,2690
         | 
| 205 | 
            -
            metaflow/plugins/aws/step_functions/production_token.py,sha256= | 
| 205 | 
            +
            metaflow/plugins/aws/step_functions/production_token.py,sha256=rREx9djJzKYDiGhPCZ919pSpfrBCYuhSL5WlwnAojNM,1890
         | 
| 206 206 | 
             
            metaflow/plugins/aws/step_functions/schedule_decorator.py,sha256=Ab1rW8O_no4HNZm4__iBmFDCDW0Z8-TgK4lnxHHA6HI,1940
         | 
| 207 207 | 
             
            metaflow/plugins/aws/step_functions/set_batch_environment.py,sha256=ibiGWFHDjKcLfprH3OsX-g2M9lUsh6J-bp7v2cdLhD4,1294
         | 
| 208 | 
            -
            metaflow/plugins/aws/step_functions/step_functions.py,sha256= | 
| 209 | 
            -
            metaflow/plugins/aws/step_functions/step_functions_cli.py,sha256= | 
| 208 | 
            +
            metaflow/plugins/aws/step_functions/step_functions.py,sha256=PSgNrT6CeKXi4dMjSnPSXv7FjAHikHo5DC55ZMLm6fw,53141
         | 
| 209 | 
            +
            metaflow/plugins/aws/step_functions/step_functions_cli.py,sha256=VixVaowCRoUIY9u8qaP4X1YQyAcEL4F3bjIDdJ4NiT0,26061
         | 
| 210 210 | 
             
            metaflow/plugins/aws/step_functions/step_functions_client.py,sha256=DKpNwAIWElvWjFANs5Ku3rgzjxFoqAD6k-EF8Xhkg3Q,4754
         | 
| 211 | 
            -
            metaflow/plugins/aws/step_functions/step_functions_decorator.py,sha256= | 
| 211 | 
            +
            metaflow/plugins/aws/step_functions/step_functions_decorator.py,sha256=jzDHYmgU_XvLffZDazR_1viow_1qQFblx9UKyjtoM_0,3788
         | 
| 212 212 | 
             
            metaflow/plugins/aws/step_functions/step_functions_deployer.py,sha256=JKYtDhKivtXUWPklprZFzkqezh14loGDmk8mNk6QtpI,3714
         | 
| 213 | 
            -
            metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py,sha256 | 
| 213 | 
            +
            metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py,sha256=zDWmrOeCEL2_uBbmdmXbVpHVTjswwjEL_rOux6MAcRI,7303
         | 
| 214 214 | 
             
            metaflow/plugins/azure/__init__.py,sha256=GuuhTVC-zSdyAf79a1wiERMq0Zts7fwVT7t9fAf234A,100
         | 
| 215 215 | 
             
            metaflow/plugins/azure/azure_credential.py,sha256=JmdGEbVzgxy8ucqnQDdTTI_atyMX9WSZUw3qYOo7RhE,2174
         | 
| 216 216 | 
             
            metaflow/plugins/azure/azure_exceptions.py,sha256=NnbwpUC23bc61HZjJmeXztY0tBNn_Y_VpIpDDuYWIZ0,433
         | 
| @@ -287,25 +287,25 @@ metaflow/plugins/gcp/gs_tail.py,sha256=qz0QZKT-5LvL8qgZZK2yyMOwuEnx1YOz-pTSAUmwv | |
| 287 287 | 
             
            metaflow/plugins/gcp/gs_utils.py,sha256=ZmIGFse1qYyvAVrwga23PQUzF6dXEDLLsZ2F-YRmvow,2030
         | 
| 288 288 | 
             
            metaflow/plugins/gcp/includefile_support.py,sha256=OQO0IVWv4ObboL0VqEZwcDOyj9ORLdur66JToxQ84vU,3887
         | 
| 289 289 | 
             
            metaflow/plugins/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 290 | 
            -
            metaflow/plugins/kubernetes/kube_utils.py,sha256= | 
| 291 | 
            -
            metaflow/plugins/kubernetes/kubernetes.py,sha256= | 
| 292 | 
            -
            metaflow/plugins/kubernetes/kubernetes_cli.py,sha256= | 
| 290 | 
            +
            metaflow/plugins/kubernetes/kube_utils.py,sha256=jdFMGbEmIow-oli26v31W9CmbZXigx06b3D_xIobpk0,4140
         | 
| 291 | 
            +
            metaflow/plugins/kubernetes/kubernetes.py,sha256=7yaa1TL3TcC-Js6_kAi0HGFLbXesMw3WiKWPlN9yIxo,30028
         | 
| 292 | 
            +
            metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=A6hI6KZ6sadPAOAyGhjwITMfnabr6voBXLRlDDxylcg,13874
         | 
| 293 293 | 
             
            metaflow/plugins/kubernetes/kubernetes_client.py,sha256=tuvXP-QKpdeSmzVolB2R_TaacOr5DIb0j642eKcjsiM,6491
         | 
| 294 | 
            -
            metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256= | 
| 295 | 
            -
            metaflow/plugins/kubernetes/kubernetes_job.py,sha256= | 
| 296 | 
            -
            metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256= | 
| 294 | 
            +
            metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=5NfrCZaGf2a2oQK4CeJExcizbojynCnEXzXqSN5Hoz0,30500
         | 
| 295 | 
            +
            metaflow/plugins/kubernetes/kubernetes_job.py,sha256=pO9ExyAVCDoAoWFn9oFcos2aa0MQk4_D61O-T4E10E8,31826
         | 
| 296 | 
            +
            metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=9kU43eE5IvIa7y-POzBdxnJOazWsedKhwQ51Tu1HN_A,42471
         | 
| 297 297 | 
             
            metaflow/plugins/metadata_providers/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
         | 
| 298 298 | 
             
            metaflow/plugins/metadata_providers/local.py,sha256=9UAxe9caN6kU1lkSlIoJbRGgTqsMa62cBTnyMwhqiaA,22446
         | 
| 299 299 | 
             
            metaflow/plugins/metadata_providers/service.py,sha256=NKZfFMamx6upP6aFRJfXlfYIhySgFNzz6kbp1yPD7LA,20222
         | 
| 300 300 | 
             
            metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
         | 
| 301 | 
            -
            metaflow/plugins/pypi/bootstrap.py,sha256= | 
| 301 | 
            +
            metaflow/plugins/pypi/bootstrap.py,sha256=x7PwFjuRNOwehVmpi5W7-JlTKHZHjwRhz6nImYlMkqo,11678
         | 
| 302 302 | 
             
            metaflow/plugins/pypi/conda_decorator.py,sha256=piFcE4uGmWhhbGlxMK0GHd7BGEyqy6r9BFy8Mjoi80Q,15937
         | 
| 303 | 
            -
            metaflow/plugins/pypi/conda_environment.py,sha256= | 
| 304 | 
            -
            metaflow/plugins/pypi/micromamba.py,sha256= | 
| 305 | 
            -
            metaflow/plugins/pypi/pip.py,sha256= | 
| 303 | 
            +
            metaflow/plugins/pypi/conda_environment.py,sha256=d5BAiY_aJJdlJ5h3N5nGSDmVoOY-8BVKqEbA5nrCpCY,22113
         | 
| 304 | 
            +
            metaflow/plugins/pypi/micromamba.py,sha256=XbVM7q6EtLwuTyB5aXzSfxd4aFOl7QNrdVRzwKX6MSE,15686
         | 
| 305 | 
            +
            metaflow/plugins/pypi/pip.py,sha256=H0cIy8odpZ-JTn4SwF0b74tuC3uRU7X8TdAQJ2kODG8,13971
         | 
| 306 306 | 
             
            metaflow/plugins/pypi/pypi_decorator.py,sha256=ybNgo-T5Z_0W2KNuED0pdjyI0qygZ4a1MXAzKqdHt_E,7250
         | 
| 307 307 | 
             
            metaflow/plugins/pypi/pypi_environment.py,sha256=FYMg8kF3lXqcLfRYWD83a9zpVjcoo_TARqMGZ763rRk,230
         | 
| 308 | 
            -
            metaflow/plugins/pypi/utils.py,sha256= | 
| 308 | 
            +
            metaflow/plugins/pypi/utils.py,sha256=855aSATi-qPhFs5OFV5dl03RDNDr5tUrPebloygrWnU,2984
         | 
| 309 309 | 
             
            metaflow/plugins/secrets/__init__.py,sha256=mhJaN2eMS_ZZVewAMR2E-JdP5i0t3v9e6Dcwd-WpruE,310
         | 
| 310 310 | 
             
            metaflow/plugins/secrets/inline_secrets_provider.py,sha256=EChmoBGA1i7qM3jtYwPpLZDBybXLergiDlN63E0u3x8,294
         | 
| 311 311 | 
             
            metaflow/plugins/secrets/secrets_decorator.py,sha256=s-sFzPWOjahhpr5fMj-ZEaHkDYAPTO0isYXGvaUwlG8,11273
         | 
| @@ -358,9 +358,9 @@ metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h | |
| 358 358 | 
             
            metaflow/user_configs/config_decorators.py,sha256=Tj0H88UT8Q6pylXxHXgiA6cqnNlw4d3mR7M8J9g3ZUg,20139
         | 
| 359 359 | 
             
            metaflow/user_configs/config_options.py,sha256=Knpiax_YGmYAdR3zKmaepN8puW1MyL9g6-eMGAkcylo,20942
         | 
| 360 360 | 
             
            metaflow/user_configs/config_parameters.py,sha256=yDiaajJGP-9W_tA_6hVuw8HDF8n5zJBccCjcrTGOYDE,13912
         | 
| 361 | 
            -
            metaflow-2.13.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
         | 
| 362 | 
            -
            metaflow-2.13.dist-info/METADATA,sha256= | 
| 363 | 
            -
            metaflow-2.13.dist-info/WHEEL,sha256= | 
| 364 | 
            -
            metaflow-2.13.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
         | 
| 365 | 
            -
            metaflow-2.13.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
         | 
| 366 | 
            -
            metaflow-2.13.dist-info/RECORD,,
         | 
| 361 | 
            +
            metaflow-2.13.1.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
         | 
| 362 | 
            +
            metaflow-2.13.1.dist-info/METADATA,sha256=dPPzZLYrVeW5jiCDUQUcagEZLiKaOAG-7CnT8_mJDZs,5906
         | 
| 363 | 
            +
            metaflow-2.13.1.dist-info/WHEEL,sha256=M1ikteR9eetPNvm1LyQ3rpXxNYuGd90oakQO1a-ohSk,109
         | 
| 364 | 
            +
            metaflow-2.13.1.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
         | 
| 365 | 
            +
            metaflow-2.13.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
         | 
| 366 | 
            +
            metaflow-2.13.1.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |