diff --git a/.jira b/.jira deleted file mode 100644 index dae3136..0000000 --- a/.jira +++ /dev/null @@ -1,4 +0,0 @@ -[project] - key = ALDN -[project "ALDN"] - id = 12702 diff --git a/Dockerfile b/Dockerfile index 4d70f5f..916f4f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN python -m venv /root/.venv ENV PATH /root/.venv/bin:$PATH # also specified around line 48 -ARG POETRY_VERSION=1.3.1 +ARG POETRY_VERSION=1.5.1 ENV PATH /root/.local/bin:$PATH RUN pip install --upgrade pip setuptools wheel && \ curl -sSL https://install.python-poetry.org -o install-poetry.py && \ @@ -46,7 +46,7 @@ RUN apt-get update && \ wget # also specified around line 15 -ARG POETRY_VERSION=1.3.1 +ARG POETRY_VERSION=1.5.1 ENV PATH /root/.local/bin:$PATH RUN pip install --upgrade pip setuptools wheel && \ curl -sSL https://install.python-poetry.org -o install-poetry.py && \ diff --git a/aladdin/commands/build_components/__init__.py b/aladdin/commands/build_components/__init__.py deleted file mode 100755 index 4a7b639..0000000 --- a/aladdin/commands/build_components/__init__.py +++ /dev/null @@ -1,500 +0,0 @@ -#!/usr/bin/env python3 -""" -The default aladdin build script to be run when "aladdin build" is invoked. - -It expects your project to conform to the "component" layout described in the documentation. - -A project can override this behavior and provide their own build script by specifying the -"build_docker" entry in its lamp.json file. -""" -import contextlib -import json -import os -import pathlib -import shutil -import subprocess -import textwrap -import time -import typing - -import jinja2 -import networkx - -from aladdin.lib import logging -from .configuration import BuildConfig, ComponentConfig, ConfigurationException -from .build_info import BuildInfo, PythonBuildInfo - -logger = logging.getLogger(__name__) - - -def parse_args(sub_parser): - subparser = sub_parser.add_parser( - "build-components", help=__doc__ - ) - subparser.set_defaults(func=lambda args: main(args.components)) - - subparser.add_argument( - "components", - help="components to build", - nargs="*", - ) - - -def main(components): - """Kick off the build process with data gathered from the system and environment.""" - - # Provide the lamp.json file data to the build process - with open("lamp.json") as lamp_file: - lamp = json.load(lamp_file) - - # Let's get to it! - build_components( - lamp=lamp, - tag_hash=os.getenv("HASH", "local"), - build_config=BuildConfig(), - components=components, - ) - - -def build_components( - lamp: dict, tag_hash: str, build_config=BuildConfig, components: typing.List[str] = None -): - """ - Build each component for the project. - - If components is empty, this will assume each directory in the components/ directory is a - component and will build each of them. - - Each component will result in up to two images being built: the image to be used in whatever - intended use case the component fulfils, and a second image, identical to the first except - that its ENTRYPOINT and CMD instructions have been "cleared". This second image will only be - built if tag_hash is "local". The resulting images will be tagged as - ``{project}-{component}:{tag_hash}`` and ``{project}-{component}:editor``, respectively. - - :param lamp: The data from the project's lamp.json file. - :param tag_hash: The build hash provided by ``aladdin build``. - :param build_config: The default values for general build settings. - :param components: The list of components to build, defaults to all of them. - """ - components_path = pathlib.Path("components") - all_components = [ - item - for item in os.listdir(components_path) - if os.path.isdir(components_path / item) and not item.startswith("_") - ] - - if not components: - # No components were specified at the command line - - if tag_hash == "local": - # Build everything if doing a local build - components = all_components - else: - # Only build components that will be published - prefix = f"{lamp['name']}-" - components = { - image[image.startswith(prefix) and len(prefix):] - for image in lamp.get("docker_images", []) - } - - # Check that all specified components actually exist in the project - for component in components: - if component not in all_components: - raise ValueError(f"Component '{component}' does not exist") - - if not components: - logger.info( - "No components found for this project. Create a component directory to get started." - ) - return - - # Sort components to attempt some level of determinism in the topological sort later - presorted_components = sorted(components) - - # Check for cycles in the component dependency graph - component_graph = validate_component_dependencies(components=presorted_components) - - # Let's build in topological order - ordered_components = [ - component - for component in networkx.algorithms.dag.topological_sort(component_graph) - if component in presorted_components - ] - - # Build each component in turn - for component in ordered_components: - try: - logger.notice("Starting build for %s component", component) - - component_dir = pathlib.Path("components") / component - if (component_dir / "component.yaml").exists(): - # This component will take advantage of our advanced build features. - # It may either be a "standard" build or a "compatible" build, depending - # on whether they specify a base image to use in their component.yaml file. - build_aladdin_component( - lamp=lamp, - build_config=build_config, - component=component, - component_graph=component_graph, - tag_hash=tag_hash, - ) - elif (component_dir / "Dockerfile").exists(): - # This component is a traditional Dockerfile component and we won't do any - # special processing - build_traditional_component( - project=lamp["name"], component=component, tag_hash=tag_hash - ) - else: - # If neither of these are specified, we do not know how to build this component - raise ConfigurationException( - "No component.yaml or Dockerfile found for '%s' component", component - ) - - except Exception: - logger.error("Failed to build image for component: %s", component) - raise - else: - logger.success("Built image for component: %s\n\n", component) - else: - logger.success("Built images for components: %s", ", ".join(ordered_components)) - - -def validate_component_dependencies(components: typing.List[str]) -> networkx.DiGraph: - """ - Confirm that the components' dependency hierarchy has no cycles. - - :returns: The component dependency graph - """ - # Copy for destructive operations - components = components.copy() - # Create the component dependency graph - component_graph = networkx.DiGraph() - visited = set() - while components: - component = components.pop() - if component not in visited: - # Mark visited to prevent infinite loop on unexpected cycles - visited.add(component) - - # Add to graph, if not already present - component_graph.add_node(component) - - # Add dependencies to graph (will implicitly add nodes) - config = ComponentConfig.read_from_component(component) - component_graph.add_edges_from( - (dependency, component) for dependency in config.dependencies - ) - - # Add any dependencies to the list of components to traverse to - components.extend(config.dependencies) - - # Check the graph for cycles - try: - cycles = networkx.algorithms.cycles.find_cycle(component_graph) - except networkx.exception.NetworkXNoCycle: - return component_graph - else: - logger.error("Cycle(s) found in component dependency graph: %s", cycles) - raise ConfigurationException("Cycle(s) found in component dependency graph", cycles) - - -def build_traditional_component(project: str, component: str, tag_hash: str) -> None: - """ - Build the component image in the traditional Dockerfile-based manner. - - This will build an image based solely on the Dockerfile in the component directory. No aladdin - boilerplate or transforms will be applied. - - :param project: The name of the project containing the component - :param component: The name of the component being built. - :param tag_hash: The hash to use as the image tag. - """ - logger.info("Building standard image for component: %s", component) - _docker_build( - tags=f"{project}-{component}:{tag_hash}", - dockerfile=pathlib.Path("components") / component / "Dockerfile", - ) - - -def build_aladdin_component( - lamp: dict, - build_config: BuildConfig, - component: str, - component_graph: networkx.DiGraph, - tag_hash: str, -) -> None: - """ - Build a component image that has been defined with a component.yaml file. - - A component can be either a "standard" build, where the base image is not specified in the - component.yaml file and default base image for the language is used (although it may be a - different version than the default), or a "compatible" build where one specifies an alternative - base image to use but still wishes to build (optional) and composite in other components' assets - into the final image. - - The "standard" build will default to applying helpful aladdin-prescribed transforms, such as - setting the working directory and creating the aladdin-user account. The "compatible" build will - default to not applying those transforms. Also, in the "compatible" build mode, it is expected - that the user will provide required information about the alternative image such as the user - account info. - - The resulting image will be tagged as ``{project}-{component}:{tag_hash}`` - - If tag_hash is "local", an accompanying editor image will be built as well and tagged with - ``{project}-{component}:editor``. - - Note: The only supported language at this time is Python 3 - - :param lamp: The data from the project's lamp.json file. - :param build_config: The default values for general build settings. - ;param component: The name of the component to build. - ;param component_graph: The component dependency graph. - :param tag_hash: The build hash provided by ``aladdin build``. - """ - # Read the component.yaml file - component_config = ComponentConfig.read_from_component(component) - - # TODO: Confirm that the component.yaml file conforms to our JSON schema - # TODO: Determine if it's a "standard" component or a "compatible" one. - # That info could be provided to the build_python_component() function as a hint - # to choose a more-specific build process. - - if component_config.language_name == "python": - build_info = PythonBuildInfo( - project=lamp["name"], - component_graph=component_graph, - component=component, - config=component_config, - tag_hash=tag_hash, - default_language_version=build_config.default_python_version, - poetry_version=build_config.default_poetry_version, - ) - - build_python_component(build_info) - else: - raise ValueError( - f"Unsupported language for {component} component: " - f"{component_config.language_name}" - ) - - if tag_hash == "local": - # Build the editor image for development use cases - build_editor_image(build_info) - - -def build_python_component(build_info: PythonBuildInfo) -> None: - """ - Build the component. - - This builds the component image according to the ``component.yaml`` configuration. It will - generate a Dockerfile and populate the components/ directory with some ephemeral configuration - files to facilate the build. A copy of the utilized Dockerfile will be able to be found at - ``components//_build.dockerfile`` for debugging and development purposes. - - :param build_info: The build info populated from the config and command line arguments. - """ - logger.info("Building image for python component: %s", build_info.component) - - # We only support python 3 components at the moment - language_version = build_info.language_version - if not language_version.startswith("3"): - raise ValueError( - f"Unsupported python version for {build_info.component} component: {language_version}" - ) - - # Load our jinja templates for python images. - jinja_env = jinja2.Environment( - loader=jinja2.PackageLoader( - "aladdin", "commands/build_components/templates/python" - ), - trim_blocks=True - ) - - # This is the top-level template for a component Dockerfile - jinja_template = jinja_env.get_template("Dockerfile.j2") - - # Place the temporary files for the duration of the build. - with build_context( - component=build_info.component, dockerfile=jinja_template.render(build_info=build_info) - ) as dockerfile_path: - - # Make the generated Dockerfile available to the component prior to attempting the build - if build_info.dev: - with contextlib.suppress(): - shutil.copyfile( - dockerfile_path, - pathlib.Path("components") / build_info.component / "_build.dockerfile", - ) - - _docker_build(tags=build_info.tag) - - -@contextlib.contextmanager -def build_context(component: str, dockerfile: str) -> typing.Generator: - """ - A context manager that writes necessary files to disk for the duration of a docker build. - - It will write three files to the components/ directory: - - The contents of dockerfile to components/Dockerfile - - A boilerplate pip.conf that ensures --user behavior - - A boilerplate poetry.toml that prevents virtual env usage - - This writes the provided contents to components/Dockerfile. It then deletes the file upon exit. - - :param component: The component to build. - :param contents: The Dockerfile contents to use within the contents. - """ - components_path = pathlib.Path("components") - pip_conf_path = components_path / "pip.conf" - poetry_toml_path = components_path / "poetry.toml" - dockerfile_path = components_path / "Dockerfile" - try: - # In addition to the generated Dockerfile, we provide these files in the build context - # so that the Dockerfile can COPY these artifacts into the image. These are boilerplate - # files that we don't want to burden the aladdin client project with including. - with open(pip_conf_path, "w") as outfile: - outfile.write( - textwrap.dedent( - """ - # This is a dynamically generated file created by build-components for the - # purpose of building the component containers. - # It is copied into our docker images to globally configure pip - - [global] - # Install packages under the user directory - user = true - # Disable the cache dir - no-cache-dir = false - - [install] - # Disable the .local warning - no-warn-script-location = false - """ - ) - ) - - with open(poetry_toml_path, "w") as outfile: - outfile.write( - textwrap.dedent( - """ - # This is a dynamically generated file created by build-components for the - # purpose of building the component containers. - # It is copied into our docker images to globally configure poetry - - [virtualenvs] - # We're in a docker container, there's no need for virtualenvs - # One should still configure pip to use "--user" behavior so that - # poetry-installed packages will be placed in ~/.local - create = false - """ - ) - ) - - with open(dockerfile_path, "w") as outfile: - outfile.write(dockerfile) - - yield dockerfile_path - finally: - with contextlib.suppress(): - dockerfile_path.unlink() - - with contextlib.suppress(): - pip_conf_path.unlink() - - with contextlib.suppress(): - poetry_toml_path.unlink() - - -def build_editor_image(build_info: BuildInfo) -> None: - """ - Build a companion image to the final built image that removes the ENTRYPOINT and CMD settings. - - This image can be used for shelling into for debugging and/or running arbitrary commands in a - mirror of the built image. - - The resulting image will be tagged as ``{project}-{component}:editor`` - - :param build_info: The build info populated from the config and command line arguments. - """ - logger.info("Building editor image for %s component", build_info.component) - - # Perform a "no context" docker build - _docker_build( - tags=build_info.editor_tag, - dockerfile=textwrap.dedent( - f""" - FROM {build_info.tag} - CMD "/bin/sh" - ENTRYPOINT [] - """ - ).encode(), - ) - - -def _docker_build( - tags: typing.Union[str, typing.List[str]], - buildargs: dict = None, - dockerfile: typing.Union[pathlib.Path, bytes] = None, -) -> None: - """ - A convenience wrapper for calling out to "docker build". - - We always send the same context: the entire components/ directory. - - :param tags: The tags to be applied to the built image. - :param buildargs: Values for ARG instructions in the dockerfile. - :param dockerfile: The dockerfile to build against. If not provided, it's assumed that a - Dockerfile is present in the context directory. If it's a bytes object, it - will be provided to the docker build process on stdin and a "no context" - build will take place. Otherwise, a normal docker build will be performed - with the specified Dockerfile. - """ - buildargs = buildargs or {} - buildargs.setdefault("CACHE_BUST", str(time.time())) - - # Disable new build system if specified by the user - docker_buildkit = os.environ.get("DOCKER_BUILDKIT", 1) - - cmd = ["env", f"DOCKER_BUILDKIT={docker_buildkit}", "docker", "build"] - - for key, value in buildargs.items(): - cmd.extend(["--build-arg", f"{key}={value}"]) - - tags = [tags] if isinstance(tags, str) else tags - for tag in tags: - cmd.extend(["--tag", tag]) - - if isinstance(dockerfile, bytes): - # If we receive the Dockerfile as content, we should pipe it to stdin. - # This is the "no context" build. - cmd.extend(["-"]) - else: - # Otherwise, they can specify the path to the Dockerfile to use or let docker - # find one in the context directory. - if dockerfile: - cmd.extend(["-f", dockerfile.as_posix()]) - cmd.extend(["components"]) - - logger.debug("Docker build command: %s", " ".join(cmd)) - _check_call(cmd, stdin=dockerfile if isinstance(dockerfile, bytes) else None) - - -def _check_call(cmd: typing.List[str], stdin: bytes = None) -> None: - """ - Make a subprocess call and indent its output to match our python logging format. - - :param cmd: The command to run. - :param stdin: Data to send to the subprocess as its input. - """ - if stdin is None: - ps = subprocess.Popen(cmd, stdout=subprocess.PIPE) - subprocess.run(["sed", "-e", "s/^/ /"], stdin=ps.stdout, check=True) - ps.wait() - if ps.returncode: - raise subprocess.CalledProcessError(ps.returncode, cmd) - else: - ps = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) - stdout, stderr = ps.communicate(input=stdin) - if ps.returncode: - raise subprocess.CalledProcessError(ps.returncode, cmd) - subprocess.run(["sed", "-e", "s/^/ /"], input=stdout, check=True) diff --git a/aladdin/commands/build_components/build_info.py b/aladdin/commands/build_components/build_info.py deleted file mode 100755 index 8274588..0000000 --- a/aladdin/commands/build_components/build_info.py +++ /dev/null @@ -1,174 +0,0 @@ -import abc -import dataclasses -import pathlib -import typing - -import networkx - -from .configuration import UNDEFINED, ComponentConfig, UserInfo - - -@dataclasses.dataclass -class BuildInfo(abc.ABC): - """ - A wrapper around the component config and some other high-level info to make parameterizing - the build process a bit simpler. The build functions should use sub-classes of this rather - than directly accessing the config object. - """ - - project: str - component_graph: networkx.DiGraph - component: str - config: ComponentConfig - tag_hash: str - default_language_version: str - - def component_packages(self, component=None) -> typing.List[str]: - """ - Provide a list of apt packages required for building python dependencies. - - This packages will only be installed in the builder image used to build the specified - component. For instance if a "commands" component depends on a "shared" component and the - "commands" component requires some packages, they will only be installed in the - builder-commands multi-stage builder image, not the build-shared image. - - :param component: The component to check for package dependencies, defaults to the current - component. - :returns: The list of packages to be installed with apt-get. - """ - component_config = ( - self.config if not component else ComponentConfig.read_from_component(component) - ) - return component_config.image_packages or [] - - @property - def language_name(self) -> str: - return self.config.language_name - - @property - def language_version(self) -> str: - return self.config.language_version or self.default_language_version - - @property - def tag(self) -> str: - return f"{self.project}-{self.component}:{self.tag_hash}" - - @property - def editor_tag(self) -> str: - return f"{self.project}-{self.component}:editor" - - @property - def dev(self) -> bool: - return self.tag_hash == "local" - - @property - @abc.abstractmethod - def base_image(self) -> str: - pass - - @property - @abc.abstractmethod - def builder_image(self) -> str: - pass - - @property - def workdir_create(self): - return self.config.image_workdir.get("create", self.config.image_base is UNDEFINED) - - @property - def workdir(self): - return self.config.image_workdir.get( - "path", "/code" if self.config.image_base is UNDEFINED else None - ) - - @property - def user_info(self) -> UserInfo: - default_name = "aladdin-user" - name = self.config.image_user_info.name or default_name - return UserInfo( - create=self.config.image_user_info.create or self.config.image_base is UNDEFINED, - name=name, - group=(self.config.image_user_info.group or name), - home=(self.config.image_user_info.home or f"/home/{name}"), - sudo=( - self.dev - if self.config.image_user_info.sudo is UNDEFINED - else self.config.image_user_info.sudo - ), - ) - - @property - def dependencies(self) -> typing.Tuple[str]: - """ - The topologically sorted list of dependencies required for this component. - - This will include the complete hierarchy of dependencies for this component, so it is only - necessary to enumerate a component's direct dependencies in the component.yaml file. - """ - dependencies = networkx.algorithms.dag.ancestors(self.component_graph, self.component) - return tuple( - networkx.algorithms.dag.topological_sort(self.component_graph.subgraph(dependencies)) - ) - - @property - def components(self) -> typing.Tuple[str]: - """ - The topologically sorted list of dependencies required for this component followed by this - component itself. - """ - return self.dependencies + (self.component,) - - @property - def dockerfile(self) -> str: - """The path to the component's dockerfile, if the file exists.""" - path = pathlib.Path("components") / self.component / "Dockerfile" - return path if path.exists() else None - - @property - def dockerfile_content(self) -> str: - """The path to the component's dockerfile contents.""" - with open(self.dockerfile) as dockerfile: - return dockerfile.read() - - -@dataclasses.dataclass -class PythonBuildInfo(BuildInfo): - """ - A BuildInfo class specialized for Python 3 projects. - - By default, images will be based on the official python "slim" distribution. - """ - - poetry_version: str - - @property - def base_image(self) -> str: - """ - If the base image is defined in the component.yaml file, this component will be built as a - "compatible" image, where the boilerplate code is mostly disabled by default. Otherwise, - this component will be built as a "standard" image with all of the attendant boilerplate. - """ - return self.config.image_base or self.builder_image - - @property - def builder_image(self) -> str: - """ - The image to be used to build and install any python dependencies. - - It should match the same python version used in the base_image. - """ - return f"python:{'.'.join(self.language_version.split('.', 2)[:2])}-slim" - - def component_is_poetry_project(self, component=None) -> bool: - """ - Return whether the component directory appears to be a python poetry project. - - A poetry project is defined by having two files: pyproject.toml and poetry.lock. - - :param component: The component to check, defaults to the current component. - :returns: Whether the required files are present. - """ - component_path = pathlib.Path("components") / (component or self.component) - pyproject_path = component_path / "pyproject.toml" - lock_path = component_path / "poetry.lock" - return pyproject_path.exists() and lock_path.exists() diff --git a/aladdin/commands/build_components/configuration.py b/aladdin/commands/build_components/configuration.py deleted file mode 100755 index 14248ff..0000000 --- a/aladdin/commands/build_components/configuration.py +++ /dev/null @@ -1,139 +0,0 @@ -import dataclasses -import functools -import pathlib -import typing - -import yaml - - -# You won't be able to instantiate this outside of this module -class _Undefined: - """Used to create a sentinel object for missing configuration values.""" - - def __bool__(self): - return False - - def __str__(self): - raise NotImplementedError - - -UNDEFINED = _Undefined() - -del _Undefined - - -class ConfigurationException(Exception): - """Raised if there is an error in the component.yaml or the component structure.""" - - -@dataclasses.dataclass -class UserInfo: - """Data defining a component image's USER.""" - - create: str - name: str - group: str - home: str - sudo: str - - def __bool__(self): - raise NotImplementedError - - @property - def chown(self) -> str: - return f"{self.name}:{self.group}" - - -class ComponentConfig: - """The representation of the component.yaml.""" - - @classmethod - def read_from_component(cls, component: str) -> "ComponentConfig": - """ - Read a component's ``component.yaml`` file into a ``ComponentConfig`` object. - - :param component: The component's config to read. - :returns: The config data for the component. If the component does not provide a - ``component.yaml`` file, this returns an empty config. - """ - try: - with open(pathlib.Path("components") / component / "component.yaml") as file: - return cls(yaml.safe_load(file)) - except ConfigurationException: - raise - except Exception: - return cls({}) - - def __init__(self, data: dict): - self._data = data - - def __bool__(self): - return bool(self._data) - - def get(self, path: str, default: typing.Any = UNDEFINED) -> typing.Any: - """ - Perform a lookup on the provided path name. - - :param path: The dot-delimited path to the config value. - :param default: The value to return if the config value was not found. - """ - # TODO: Consider using jmespath here instead - return functools.reduce( - lambda d, key: d.get(key, default) if isinstance(d, dict) else default, - path.split("."), - self._data, - ) - - @property - def version(self) -> int: - return self.get("meta.version", 1) - - @property - def language_name(self) -> str: - name = self.get("language.name") - return name.lower() if name else UNDEFINED - - @property - def language_version(self) -> str: - version = self.get("language.version") - return str(version) if version else UNDEFINED - - @property - def language_spec(self) -> dict: - return self.get("language.spec") - - @property - def image_base(self) -> str: - return self.get("image.base") - - @property - def image_packages(self) -> typing.List[str]: - return self.get("image.packages") - - @property - def image_user_info(self) -> UserInfo: - return UserInfo( - create=self.get("image.user.create"), - name=self.get("image.user.name"), - group=self.get("image.user.group"), - home=self.get("image.user.home"), - sudo=self.get("image.user.sudo"), - ) - - @property - def image_workdir(self) -> dict: - return self.get("image.workdir", {}) - - @property - def dependencies(self) -> typing.List[str]: - return self.get("dependencies", []) - - -@dataclasses.dataclass -class BuildConfig: - """ - System defaults that can be overridden by command-line arguments and/or component.yaml settings. - """ - - default_python_version: str = "3.8" - default_poetry_version: str = "1.0.9" diff --git a/aladdin/commands/build_components/templates/python/Dockerfile.j2 b/aladdin/commands/build_components/templates/python/Dockerfile.j2 deleted file mode 100755 index 6dcc2d1..0000000 --- a/aladdin/commands/build_components/templates/python/Dockerfile.j2 +++ /dev/null @@ -1,142 +0,0 @@ -{% from "macros.j2" import install_poetry, build_component, collect_components, add_poetry, add_user, add_collected_components %} -#################################################################################################### -# This is a dynamically generated file created by build-components for building the -# "{{build_info.tag}}" docker image. This is actually a copy of the file used -# during the build and is only intended for informational and debugging purposes. -#################################################################################################### - - -#################################################################################################### -#################################################################################################### -# Build multi-stage builder images -#################################################################################################### -#################################################################################################### - -#################################################################################################### -# [builder-poetry] -#################################################################################################### -FROM {{build_info.builder_image}} AS builder-poetry -{{ install_poetry(build_info.poetry_version) }} - -### /end [builder-poetry] ########################################################################## -{% for component in build_info.components %} - - -#################################################################################################### -# [builder-{{component}}] -#################################################################################################### -{{ build_component(component, build_info) }} - -### /end [builder-{{component}}] ################################################################### -{% endfor %} - - - -#################################################################################################### -#################################################################################################### -# Collect components (to minimize layers in final build) -#################################################################################################### -#################################################################################################### -{{ collect_components(build_info) }} - - -#################################################################################################### -#################################################################################################### -# Begin actual image build -#################################################################################################### -#################################################################################################### -FROM {{build_info.base_image}} - -{% if build_info.component_packages() %} -# Install any additional packages required by the component -RUN apt-get update \ - && apt-get -y --no-install-recommends install \ - {{" ".join(build_info.component_packages())}} \ - && rm -rf /var/lib/apt/lists/* - -{% endif %} - -#################################################################################################### -# Pre-compile python core library code -#################################################################################################### -{% if not build_info.dev %} -RUN python -O -m compileall -{% else %} -# Not pre-compiling python core library code since this is a dev image -{% endif %} - -{% if build_info.user_info.create %} -#################################################################################################### -# Create the unprivileged user account -#################################################################################################### -{{ add_user(build_info.user_info) }} -{% else %} -#################################################################################################### -# Use the existing user account -#################################################################################################### -# USER {{build_info.user_info.name}} -# home: {{build_info.user_info.home}} -# group: {{build_info.user_info.group}} -# chown: {{build_info.user_info.chown}} -{% endif %} - -{% if build_info.workdir_create %} -#################################################################################################### -# Create the WORKDIR to house our project code -#################################################################################################### -WORKDIR {{build_info.workdir}} -RUN chown {{build_info.user_info.chown}} {{build_info.workdir}} -{% else %} -#################################################################################################### -# Use existing WORKDIR to house our project code -#################################################################################################### -# WORKDIR {{build_info.workdir}} -{% endif %} - -# Ensure WORKDIR is on the PYTHONPATH -ENV PYTHONPATH={{build_info.workdir}}${PYTHONPATH:+:$PYTHONPATH} - -{% if build_info.user_info.create %} -# Switch to the unprivileged user account -USER {{build_info.user_info.name}} -{% endif %} - -{% if build_info.dev %} -{# - This must be done after the user directory is created and switched to, - as poetry expects to be installed under the current user's home directory. -#} -#################################################################################################### -# Install poetry -#################################################################################################### -{{ add_poetry(build_info.user_info) }} -{% endif %} - -#################################################################################################### -# Add collected components -#################################################################################################### -{{ add_collected_components(build_info.user_info) }} - -{% if build_info.dockerfile %} -#################################################################################################### -# Component dockerfile: components/{{build_info.component}}/Dockerfile -#################################################################################################### -{{ build_info.dockerfile_content }} -{% else %} -#################################################################################################### -# No Dockerfile found for {{build_info.component}} component -#################################################################################################### -{% endif %} - -#################################################################################################### -# Finalize image -#################################################################################################### -# Check that our collected libraries didn't introduce any conflicts -RUN pip check - -{% if not build_info.dev %} -# Compile our collected python code and libraries -RUN python -O -m compileall ~/.local . -{% else %} -# Not pre-compiling python components and library code since this is a dev image -{% endif %} diff --git a/aladdin/commands/build_components/templates/python/macros.j2 b/aladdin/commands/build_components/templates/python/macros.j2 deleted file mode 100755 index 33b4d95..0000000 --- a/aladdin/commands/build_components/templates/python/macros.j2 +++ /dev/null @@ -1,192 +0,0 @@ -{# [Builder image] - Download and install poetry under the root user. -#} -{% macro install_poetry(version) %} -# Install poetry -# Note: We prefer to install python packages as --user so that the artifacts are easier -# to copy out of the builder image into the final image. poetry already installs -# itself under the user directory, and we eventually copy the poetry tool and the -# installed python packages under the image USER in the resulting image. - -# Ensure we have curl so we can install poetry -RUN apt-get update \ - && apt-get -y --no-install-recommends install \ - curl - -# Configure pip, mainly to ensure that packages are installed in the user directory. -COPY pip.conf /etc/pip.conf - -# Install poetry under the root user's home directory. -# On some images "sh" is aliased to "dash" which does not support "set -o pipefail". -# We use the "exec" form of RUN to delegate this command to bash instead. -# This is all because we have a pipe in this command and we wish to fail the build -# if any command in the pipeline fails. -RUN ["/bin/bash", "-c", "set -o pipefail && pip install --upgrade pip && curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_VERSION={{version}} python"] -COPY poetry.toml /root/.config/pypoetry/config.toml -ENV PATH=/root/.poetry/bin:$PATH -{% endmacro %} - - -{# [Builder image] - Install or copy the component. -#} -{% macro build_component(component, build_info) %} -FROM {{build_info.builder_image}} AS builder-{{component}} - -# Install packages required to build native library components -RUN apt-get update \ - && apt-get -y --no-install-recommends install \ - build-essential -# We intentionally do not clear the lists here, as it's unnecessary for a builder image -# and we may need to install some component-specific components, too. -# The image size here isn't as much of a concern, since none of these build tools will -# end-up in the final built image. - -{% if build_info.component_packages(component) %} -# Install any additional packages required by the component -RUN apt-get -y --no-install-recommends install \ - {{" ".join(build_info.component_packages(component))}} - -{% endif %} - -{% if build_info.component_is_poetry_project(component) %} -{{ install_poetry(build_info.poetry_version) }} -{% endif %} - -{# - We use the eventual image's working directory here because we will likely "poetry install" a component. - This will install the package in "editable" mode, where it builds the .egg-info directory directly in - the source directory and creates an .egg-link file in the site-packages directory. This link consists - of an absolute path pointing at the package directory, which will be the component directory itself. - We will copy the site-packages directory (containing the .egg-link file) and the component directory - from the build image into the final image. This means that the working directory here must match the - one used in the final generated image to preserve the integrity of the .egg-link file. This is also - crucial to allowing us to mount the source code directory during development for rapid dev and testing. -#} -# Use the final image's working directory -WORKDIR {{build_info.workdir}} - -{% if build_info.component_is_poetry_project(component) %} -# Copy the {{component}} component's poetry files into the image -COPY {{component}}/pyproject.toml {{component}}/poetry.lock {{component}}/ - -# Build the {{component}} component's dependencies into /root/.local{% if not build_info.dev %} and then pre-compile them -{% endif %} - -RUN cd {{component}} \ - && poetry install --no-root {% if not build_info.dev %} --no-dev \ - && python -O -m compileall /root/.local -{% endif %} - -{% endif %} - -# Get the {{component}} component's code and assets -COPY {{component}} {{component}} - -{% if build_info.component_is_poetry_project(component) %} -# Install the {{component}} component's python package -RUN cd {{component}} \ - && poetry install {% if not build_info.dev %} --no-dev \ - && python -O -m compileall . -{% endif %} - -{% endif %} -{% endmacro %} - -{# [Builder image] - Collect the python dependencies and component content into an intermediate builder image - so that we only need two COPY operations to get all of the component contents into the - final image, instead of two for each component. -#} -{% macro collect_components(build_info) %} -FROM {{build_info.builder_image}} AS builder-collect - -# The /root/.local directory is where poetry will have installed our python packages. -# The easy-install.pth file contains additional package locations for installed packages. -# In our case, it's important because components organized as installable python packages -# will be added to this file when installed with poetry. We need to take steps to composite -# these files together here, since each component will have been built in its own builder -# image. We will copy this directory (containing the composited easy-install.pth file) into -# the final built image. -# Ensure that these exist even if no python packages were built and collected. -RUN mkdir -p /root/.local \ - && touch /tmp/easy-install.pth - -# Copy built python dependencies before copying any code over to maximize layer caching -{% for component in build_info.components %} -RUN pth="$(python -c "import site; print(site.getusersitepackages())")/easy-install.pth" \ - && mkdir -p "$(dirname "$pth")" \ - && touch "$pth" - -{% if build_info.component_is_poetry_project(component) %} -COPY --from="builder-{{component}}" /root/.local /root/.local -RUN pth="$(python -c "import site; print(site.getusersitepackages())")/easy-install.pth" \ - && cat "$pth" >> /tmp/easy-install.pth \ - && cat /tmp/easy-install.pth -{% endif -%} -{% endfor %} - -RUN sort "$(python -c "import site; print(site.getusersitepackages())")/easy-install.pth" - -{# - We collect components' assets into the /components directory. This directory location is - unimportant as the contents are only being stashed here until they can be copied out to - the final image in a single COPY step. -#} -# Copy component contents (from the builder images' WORKDIRs) -{% for component in build_info.components %} -COPY --from="builder-{{component}}" {{build_info.workdir}}/{{component}} /components/{{component}} -{% endfor %} -{% endmacro %} - - -{# - Copy the components' dependencies and artifacts into the final image. - - Built python dependencies get copied to the users ~/.local directory. - Component code & assets get copied to WORKDIR. - #} -{% macro add_collected_components(user_info) %} -# Copy any built python packages to the ~/.local directory hierarchy and -# ensure that any installed python scripts can be found on the PATH -COPY --from="builder-collect" --chown={{user_info.chown}} /root/.local {{user_info.home}}/.local -ENV PATH={{user_info.home}}/.local/bin:$PATH - -{# This is where we copy the items from the temporary /components directory noted above #} -# Copy collected components' contents to the working directory -COPY --from="builder-collect" --chown={{user_info.chown}} /components ./ -{% endmacro %} - -{# - Add a user account to the image and switch to it. -#} -{% macro add_user(user_info) %} -{% if user_info.sudo %} -# Add it to the sudoers list, too -{% endif %} -RUN groupadd -f {{user_info.group}} \ - && useradd -m -d {{user_info.home}} -g {{user_info.group}} {{user_info.name}} {% if user_info.sudo %} \ - && apt-get update && apt-get -y --no-install-recommends install sudo \ - && rm -rf /var/lib/apt/lists/* \ - && echo >> /etc/sudoers "{{user_info.name}} ALL=(ALL) NOPASSWD: ALL" -{% endif %} -{% endmacro %} - - -{# - Copy the poetry install from the poetry builder image into a system location and configure - it for usage by any user on the system. -#} -{% macro add_poetry(user_info) %} -# Copy the poetry installation from the builder image to the user directory in the target image. -# We also take care to add the poetry bin directory to the PATH, which is what "source $HOME/.poetry/env" -# would accomplish in a normal installation scenario. -COPY --from="builder-poetry" --chown={{user_info.chown}} /root/.poetry {{user_info.home}}/.poetry -ENV PATH={{user_info.home}}/.poetry/bin:$PATH - -# Configure poetry (to avoid virtual env usage) -COPY --from="builder-poetry" --chown={{user_info.chown}} /root/.config/pypoetry {{user_info.home}}/.config/pypoetry - -# Configure pip (to install as --user) -COPY --from="builder-poetry" --chown={{user_info.chown}} /etc/pip.conf /etc/pip.conf -{% endmacro %} diff --git a/aladdin/lib/project_conf.py b/aladdin/lib/project_conf.py index e05a68f..f4962a6 100644 --- a/aladdin/lib/project_conf.py +++ b/aladdin/lib/project_conf.py @@ -59,7 +59,7 @@ def name(self): @property def build_command(self): - cmd = search("build_docker", self.lamp_content) or ["aladdin", "build-components"] + cmd = search("build_docker", self.lamp_content) or search("build", self.lamp_content) return [cmd] if isinstance(cmd, str) else cmd def build_docker(self, env=None, build_args=None): diff --git a/aladdin/main.py b/aladdin/main.py index 03f006b..41a8b35 100755 --- a/aladdin/main.py +++ b/aladdin/main.py @@ -9,7 +9,6 @@ from aladdin.lib.arg_tools import get_bash_commands, bash_wrapper from aladdin.commands import ( build, - build_components, cluster_init, cmd, connect, @@ -46,7 +45,6 @@ def cli(): subparsers = parser.add_subparsers(help="aladdin commands") subcommands = [ build, - build_components, cluster_init, cmd, connect, diff --git a/poetry.lock b/poetry.lock index 274100c..d647a8f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,21 +2,24 @@ [[package]] name = "attrs" -version = "22.2.0" +version = "23.1.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "aws-error-utils" @@ -81,17 +84,17 @@ files = [ [[package]] name = "boto3" -version = "1.26.35" +version = "1.28.11" description = "The AWS SDK for Python" optional = false python-versions = ">= 3.7" files = [ - {file = "boto3-1.26.35-py3-none-any.whl", hash = "sha256:f786a12eb036bbe6f473a351182275fd5c43c4e9c523cb8ec9b1946b18830d0d"}, - {file = "boto3-1.26.35.tar.gz", hash = "sha256:282c9aa0af39fc3f0fac9c91e05f43145ff3d5fee29189b5343490131555981a"}, + {file = "boto3-1.28.11-py3-none-any.whl", hash = "sha256:e24460d50001b517c6734dcf1c879feb43aa2062d88d9bdbb8703c986cb05941"}, + {file = "boto3-1.28.11.tar.gz", hash = "sha256:0fe7a35cf0041145c8eefebd3ae2ddf41baed62d7c963e5042b8ed8c297f648f"}, ] [package.dependencies] -botocore = ">=1.29.35,<1.30.0" +botocore = ">=1.31.11,<1.32.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.6.0,<0.7.0" @@ -100,13 +103,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.29.35" +version = "1.31.11" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">= 3.7" files = [ - {file = "botocore-1.29.35-py3-none-any.whl", hash = "sha256:fc329d2772284dcffdf947023de589eaf72a4eb4737505114b1c0f3a1063b3b6"}, - {file = "botocore-1.29.35.tar.gz", hash = "sha256:ca673347f46f03fb5f1e56326adc9c696daba860838dffbe85e9bb16a8c54d67"}, + {file = "botocore-1.31.11-py3-none-any.whl", hash = "sha256:d3cbffe554c9a1ba2ac6973734c43c21b8e7985a2ac4a4c31a09811b8029445c"}, + {file = "botocore-1.31.11.tar.gz", hash = "sha256:b17ff973bb70b02b227928c2abe4992f1cfc46d13aee0228516c8f32572b88c6"}, ] [package.dependencies] @@ -115,7 +118,7 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = ">=1.25.4,<1.27" [package.extras] -crt = ["awscrt (==0.15.3)"] +crt = ["awscrt (==0.16.26)"] [[package]] name = "cached-property" @@ -130,40 +133,110 @@ files = [ [[package]] name = "cachetools" -version = "5.2.0" +version = "5.3.1" description = "Extensible memoizing collections and decorators" optional = false -python-versions = "~=3.7" +python-versions = ">=3.7" files = [ - {file = "cachetools-5.2.0-py3-none-any.whl", hash = "sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db"}, - {file = "cachetools-5.2.0.tar.gz", hash = "sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757"}, + {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, + {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, ] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.6.0" -files = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "click" version = "8.1.6" @@ -209,26 +282,28 @@ cron = ["capturer (>=2.4)"] [[package]] name = "google-auth" -version = "2.15.0" +version = "2.22.0" description = "Google Authentication Library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.6" files = [ - {file = "google-auth-2.15.0.tar.gz", hash = "sha256:72f12a6cfc968d754d7bdab369c5c5c16032106e52d32c6dfd8484e4c01a6d1f"}, - {file = "google_auth-2.15.0-py2.py3-none-any.whl", hash = "sha256:6897b93556d8d807ad70701bb89f000183aea366ca7ed94680828b37437a4994"}, + {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, + {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +rsa = ">=3.1.4,<5" six = ">=1.9.0" +urllib3 = "<2.0" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "humanfriendly" @@ -274,23 +349,6 @@ zipp = ">=0.5" docs = ["rst.linker", "sphinx"] testing = ["importlib-resources (>=1.3)", "packaging", "pep517"] -[[package]] -name = "jinja2" -version = "2.11.3" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, -] - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - [[package]] name = "jmespath" version = "1.0.1" @@ -352,128 +410,49 @@ adal = ["adal (>=1.0.2)"] [[package]] name = "lazy-object-proxy" -version = "1.8.0" +version = "1.9.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.7" files = [ - {file = "lazy-object-proxy-1.8.0.tar.gz", hash = "sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0"}, - {file = "lazy_object_proxy-1.8.0-pp37-pypy37_pp73-any.whl", hash = "sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891"}, - {file = "lazy_object_proxy-1.8.0-pp38-pypy38_pp73-any.whl", hash = "sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec"}, - {file = "lazy_object_proxy-1.8.0-pp39-pypy39_pp73-any.whl", hash = "sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8"}, -] - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.6" -files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] - -[[package]] -name = "networkx" -version = "2.6.3" -description = "Python package for creating and manipulating graphs and networks" -optional = false -python-versions = ">=3.7" -files = [ - {file = "networkx-2.6.3-py3-none-any.whl", hash = "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef"}, - {file = "networkx-2.6.3.tar.gz", hash = "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51"}, + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, ] -[package.extras] -default = ["matplotlib (>=3.3)", "numpy (>=1.19)", "pandas (>=1.1)", "scipy (>=1.5,!=1.6.1)"] -developer = ["black (==21.5b1)", "pre-commit (>=2.12)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.1)", "pillow (>=8.2)", "pydata-sphinx-theme (>=0.6,<1.0)", "sphinx (>=4.0,<5.0)", "sphinx-gallery (>=0.9,<1.0)", "texext (>=0.6.6)"] -extra = ["lxml (>=4.5)", "pydot (>=1.4.1)", "pygraphviz (>=1.7)"] -test = ["codecov (>=2.1)", "pytest (>=6.2)", "pytest-cov (>=2.12)"] - [[package]] name = "oauthlib" version = "3.2.2" @@ -492,28 +471,28 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, ] [[package]] name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" +pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pyreadline" @@ -538,33 +517,38 @@ files = [ [[package]] name = "pyrsistent" -version = "0.19.2" +version = "0.19.3" description = "Persistent/Functional/Immutable data structures" optional = false python-versions = ">=3.7" files = [ - {file = "pyrsistent-0.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a"}, - {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a"}, - {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed"}, - {file = "pyrsistent-0.19.2-cp310-cp310-win32.whl", hash = "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41"}, - {file = "pyrsistent-0.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-win32.whl", hash = "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73"}, - {file = "pyrsistent-0.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308"}, - {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584"}, - {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb"}, - {file = "pyrsistent-0.19.2-cp38-cp38-win32.whl", hash = "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a"}, - {file = "pyrsistent-0.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab"}, - {file = "pyrsistent-0.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770"}, - {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95"}, - {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e"}, - {file = "pyrsistent-0.19.2-cp39-cp39-win32.whl", hash = "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b"}, - {file = "pyrsistent-0.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291"}, - {file = "pyrsistent-0.19.2-py3-none-any.whl", hash = "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0"}, - {file = "pyrsistent-0.19.2.tar.gz", hash = "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2"}, + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, ] [[package]] @@ -632,20 +616,20 @@ files = [ [[package]] name = "requests" -version = "2.28.1" +version = "2.31.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -685,13 +669,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "s3transfer" -version = "0.6.0" +version = "0.6.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">= 3.7" files = [ - {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, - {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, + {file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"}, + {file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"}, ] [package.dependencies] @@ -702,18 +686,18 @@ crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] [[package]] name = "setuptools" -version = "65.6.3" +version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, - {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"}, + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -756,13 +740,13 @@ files = [ [[package]] name = "websocket-client" -version = "1.4.2" +version = "1.6.1" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.7" files = [ - {file = "websocket-client-1.4.2.tar.gz", hash = "sha256:d6e8f90ca8e2dd4e8027c4561adeb9456b54044312dba655e7cae652ceb9ae59"}, - {file = "websocket_client-1.4.2-py3-none-any.whl", hash = "sha256:d6b06432f184438d99ac1f456eaf22fe1ade524c3dd16e661142dc54e9cba574"}, + {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"}, + {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"}, ] [package.extras] @@ -772,20 +756,20 @@ test = ["websockets"] [[package]] name = "zipp" -version = "3.11.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.7" files = [ - {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, - {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "2.0" python-versions = "^3.7" -content-hash = "9a52fb15cd277c5cf38e92b479ac14248f2ef52575f9c5acabd4505f618f62eb" +content-hash = "8796b073a40e63d67f0224a1a95ecaa4b540a21a9adf1f8888db8bde4f22034c" diff --git a/pyproject.toml b/pyproject.toml index db02740..0cc9557 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,14 +18,10 @@ kubernetes = "20.13.0" coloredlogs = "^15.0.1" verboselogs = "^1.7" PyYAML = "^6.0.1" -networkx = "^2.4" -jinja2 = "^2.11.2" lazy-object-proxy = "^1.5.1" urllib3 = "1.26.12" importlib-metadata = {version = "^1.0", python = "<3.8"} "backports.cached-property" = {version = "^1.0.1", python = "<3.8"} -# jinja2 dependency, but there is a breaking change in v2.1.0 -markupsafe = "2.0.1" # https://github.com/pallets/markupsafe/issues/284 aws-sso-util = "^4.28.0" [tool.poetry.dev-dependencies]