diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 663e4ac5d..20e22e054 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -1,7 +1,8 @@ -name: Benchmark +name: 📊 Benchmarks on: push: {} workflow_call: {} + jobs: benchmark_sql_algorithm: runs-on: ubuntu-latest @@ -13,7 +14,7 @@ jobs: working-directory: ./sample-apps/databases run: docker compose up --build -d - name: Set up Python 3.9 - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: 3.9 @@ -30,15 +31,24 @@ jobs: run: | poetry run python ./benchmarks/sql_benchmark/sql_benchmark_fw.py poetry run python ./benchmarks/sql_benchmark/sql_benchmark_no_fw.py + benchmark_with_flask_mysql: runs-on: ubuntu-latest timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - name: Checkout code uses: actions/checkout@v4 - name: Start databases working-directory: ./sample-apps/databases run: docker compose up --build -d + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} - name: Install dependencies & build run: | python -m pip install --upgrade pip @@ -51,15 +61,24 @@ jobs: - name: Run flask-mysql k6 Benchmark run: | k6 run -q ./benchmarks/flask-mysql-benchmarks.js + benchmark_with_starlette_app: runs-on: ubuntu-latest timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - name: Checkout code uses: actions/checkout@v4 - name: Start databases working-directory: ./sample-apps/databases run: docker compose up --build -d + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} - name: Install dependencies & build run: | python -m pip install --upgrade pip @@ -71,9 +90,5 @@ jobs: run: | sudo apt-get update sudo apt-get install -y wrk - - name: Set up Python 3.9 - uses: actions/setup-python@v2 - with: - python-version: 3.9 - name: Run benchmark run: python ./benchmarks/starlette_benchmark.py diff --git a/.github/workflows/end2end.yml b/.github/workflows/end2end.yml index 92fabfeb5..2c10c24c3 100644 --- a/.github/workflows/end2end.yml +++ b/.github/workflows/end2end.yml @@ -35,7 +35,7 @@ jobs: - { name: flask-postgres-xml, testfile: end2end/flask_postgres_xml_lxml_test.py } - { name: quart-postgres-uvicorn, testfile: end2end/quart_postgres_uvicorn_test.py } - { name: starlette-postgres-uvicorn, testfile: end2end/starlette_postgres_uvicorn_test.py } - python-version: ["3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12", "3.13"] steps: - name: Install packages run: sudo apt update && sudo apt install python3-dev libmysqlclient-dev @@ -53,7 +53,7 @@ jobs: docker run --name mock_core -d -p 5000:5000 mock_core - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a51a28ce4..810a19c21 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,7 +9,7 @@ jobs: uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: '3.x' diff --git a/.github/workflows/smoke-test-ffi.yml b/.github/workflows/smoke-test-ffi.yml index eb9184a47..868196510 100644 --- a/.github/workflows/smoke-test-ffi.yml +++ b/.github/workflows/smoke-test-ffi.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: 3.12 diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 9ed88da34..6eee50772 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -10,7 +10,7 @@ jobs: # Don't cancel jobs if one fails fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] steps: - name: Checkout code uses: actions/checkout@v4 @@ -22,7 +22,7 @@ jobs: run: | sudo echo "127.0.0.1 local.aikido.io" | sudo tee -a /etc/hosts - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/aikido_zen/__init__.py b/aikido_zen/__init__.py index 6c9814055..72ce58c5d 100644 --- a/aikido_zen/__init__.py +++ b/aikido_zen/__init__.py @@ -50,9 +50,6 @@ def protect(mode="daemon"): import aikido_zen.sources.xml_sources.xml import aikido_zen.sources.xml_sources.lxml - import aikido_zen.sources.gunicorn - import aikido_zen.sources.uwsgi - # Import DB Sinks import aikido_zen.sinks.pymysql import aikido_zen.sinks.mysqlclient diff --git a/aikido_zen/background_process/packages.py b/aikido_zen/background_process/packages.py index 19425e37a..e8712e89f 100644 --- a/aikido_zen/background_process/packages.py +++ b/aikido_zen/background_process/packages.py @@ -39,7 +39,7 @@ def is_package_compatible(package=None, required_version=ANY_VERSION, packages=N return True # No match found - logger.info("Zen does not support %s", packages) + logger.info("Zen does not support current version of %s", "/".join(packages)) return False except Exception as e: logger.debug("Exception occurred in is_package_compatible: %s", e) diff --git a/aikido_zen/importhook/__init__.py b/aikido_zen/importhook/__init__.py deleted file mode 100644 index a33145a66..000000000 --- a/aikido_zen/importhook/__init__.py +++ /dev/null @@ -1,166 +0,0 @@ -""" -importhook -========== - -Python module for registering hooks to call when certain modules are imported. - -.. code:: python - - import importhook - - # Configure a function to call when `socket` is imported - @importhook.on_import('socket') - def socket_import(socket): - print('Socket module imported') - - # Import the `socket` module - import socket -""" - -import functools -import importlib -import sys -import types - -from .meta_paths import HookMetaPaths -from .registry import registry -from .utils import get_module_name - -__all__ = [ - "ANY_MODULE", - "copy_module", - "get_module_name", - "on_import", - "registry", - "reload_module", - "reset_module", -] - -ANY_MODULE = None - -# Wrap existing (and future) system meta path finders -sys.meta_path = HookMetaPaths(sys.meta_path[:]) - - -def on_import(module_name, func=None): - """ - Helper function used to register a hook function for a given module - - .. code:: python - - import importhook - - @importhook.on_import('socket') - def on_socket_import(socket): - print('socket imported') - - - @importhook.on_import(importhook.ANY_MODULE) - def on_any_import(module): - print(f'{module.__spec__.name} imported') - - - def on_httplib_import(httplib): - print('httplib imported') - - - importhook.on_import('httplib', on_httplib_import) - """ - if func is None: - - @functools.wraps(func) - def decorator(func): - registry[module_name] = func - return func - - return decorator - else: - registry[module_name] = func - - -def reset_module(module_name): - """ - Helper function to reset a copied module. - - .. code:: python - - import socket - import importhook - - # Copy `socket` module - socket = importhook.copy_module(socket) - - # Reset copied `socket` module back to it's original version - socket = importhook.reset_module(socket) - """ - if not isinstance(module_name, str): - module_name = get_module_name(module_name) - - module = sys.modules.get(module_name) - if not module: - return None - - if not hasattr(module, "__original_module__"): - return module - - sys.modules[module_name] = module.__original_module__ - return module.__original_module__ - - -def copy_module(module, copy_attributes=True, copy_spec=True): - """ - Helper function for copying a python module - - .. code:: python - - import importhook - - @importhook.on_import('socket') - def on_socket_import(socket): - new_socket = importhook.copy_module(socket) - setattr(new_socket, 'get_hostname', lambda: 'hostname') - return new_socket - """ - name = get_module_name(module) - new_mod = types.ModuleType(name) - setattr(new_mod, "__original_module__", module) - setattr(new_mod, "__reset_module__", lambda: reset_module(name)) - - # Copy all module attributes - if copy_attributes: - for attr, value in module.__dict__.items(): - setattr(new_mod, attr, value) - - # Make a copy of the modules spec if one is present - if copy_spec and getattr(new_mod, "__spec__", None): - spec = type(new_mod.__spec__)(name=name, loader=new_mod.__spec__.loader) - for attr, value in new_mod.__spec__.__dict__.items(): - if attr not in ("name", "loader"): - setattr(spec, attr, value) - new_mod.__spec__ = spec - return new_mod - - -def reload_module(module_name): - """ - Helper function to reload the specified module - - .. code:: python - - import socket - import importhook - - # Reload the `socket` module by passing in module - socket = importhook.reload_module(socket) - - # Reload the `socket` module by passing in the name - socket = importhook.reload_module('socket') - """ - if not isinstance(module_name, str): - module_name = get_module_name(module_name) - - module = sys.modules.get(module_name) - if not module: - return None - - return importlib.reload(module) diff --git a/aikido_zen/importhook/finder.py b/aikido_zen/importhook/finder.py deleted file mode 100644 index 6ba0938e1..000000000 --- a/aikido_zen/importhook/finder.py +++ /dev/null @@ -1,55 +0,0 @@ -import functools - -from .loader import HookLoader - - -def hook_finder(finder): - """ - Helper function to create a new "hooked" subclass of the provided finder class - - This function replaces the `Finder.find_spec` function to ensure that any ModuleSpecs will - use an `importmod.HookLoader` - """ - # If this finder has already been 'hooked', then return as-is - if hasattr(finder, "__hooked__"): - return finder - - # Determine if we were given an instance or a class - if isinstance(finder, type): - finder_cls = finder - else: - finder_cls = finder.__class__ - - # Determine the class name of the finder - finder_name = finder_cls.__name__ - - def wrap_find_spec(find_spec): - @functools.wraps(find_spec) - def wrapper(fullname, path, target=None): - spec = find_spec(fullname, path, target=target) - if spec is not None and spec.loader is not None: - spec.loader = HookLoader(spec.loader) - return spec - - return wrapper - - def wrap_find_loader(find_loader): - @functools.wraps(find_loader) - def wrapper(fullname, path): - loader = find_loader(fullname, path) - if loader is None: - return None - else: - return HookLoader(loader) - - return wrapper - - # Override the functions we care about - if hasattr(finder, "find_spec"): - setattr(finder, "find_spec", wrap_find_spec(finder.find_spec)) - if hasattr(finder, "find_loader"): - setattr(finder, "find_loader", wrap_find_loader(finder.find_loader)) - - # Make this finder as being 'hooked' - setattr(finder, "__hooked__", True) - return finder diff --git a/aikido_zen/importhook/loader.py b/aikido_zen/importhook/loader.py deleted file mode 100644 index 048ed5b2d..000000000 --- a/aikido_zen/importhook/loader.py +++ /dev/null @@ -1,84 +0,0 @@ -from importlib.abc import Loader -import sys - -from .registry import registry -from .utils import get_module_name - - -def call_module_hooks(module): - name = get_module_name(module) - - # If we have a hook in the registry, then call it now - if name in registry: - mod = registry[name](module) - if mod is not None: - sys.modules[name] = mod - - # If we have a global hook in the registry, then call it now - if None in registry: - mod = registry[None](module) - if mod is not None: - sys.modules[name] = mod - - -class HookLoader(Loader): - """ - Custom `importlib.abc.Loader` which ensures we call any registered hooks when a module is loaded. - """ - - __slots__ = ["loader"] - - def __init__(self, loader): - self.loader = loader - - def __getattribute__(self, name): - # If they are requesting the "loader" attribute, return it right away - loader = super(HookLoader, self).__getattribute__("loader") - if name == "loader": - return loader - - # Pass through attributes/methods only if they exist on the underlying loader - if hasattr(loader, name): - try: - return super(HookLoader, self).__getattribute__(name) - except AttributeError: - return getattr(loader, name) - - raise AttributeError - - def create_module(self, *args, **kwargs): - if not hasattr(self.loader, "create_module"): - return None - - return self.loader.create_module(*args, **kwargs) - - def find_module(self, name, *args, **kwargs): - if not hasattr(self.loader, "find_module"): - return None - - module = self.loader.find_module(name=name, *args, **kwargs) - if module is None: - return None - call_module_hooks(module) - return module - - def load_module(self, name, *args, **kwargs): - if not hasattr(self.loader, "load_module"): - return None - - module = self.loader.load_module(name, *args, **kwargs) - if module is None: - return None - call_module_hooks(module) - return module - - def exec_module(self, module, *args, **kwargs): - if not hasattr(self.loader, "exec_module"): - return None - - mod = self.loader.exec_module(module, *args, **kwargs) - if mod is not None: - module = mod - - call_module_hooks(module) - return module diff --git a/aikido_zen/importhook/meta_paths.py b/aikido_zen/importhook/meta_paths.py deleted file mode 100644 index 102d093ec..000000000 --- a/aikido_zen/importhook/meta_paths.py +++ /dev/null @@ -1,15 +0,0 @@ -from .finder import hook_finder - - -class HookMetaPaths(list): - """ - Custom list that will ensure any items added are wrapped as a "hooked" finder - - This class is made to replace `sys.meta_paths` - """ - - def __init__(self, finders): - super(HookMetaPaths, self).__init__([hook_finder(f) for f in finders]) - - def __setitem__(self, key, val): - super(HookMetaPaths, self).__setitem__(key, hook_finder(val)) diff --git a/aikido_zen/importhook/registry.py b/aikido_zen/importhook/registry.py deleted file mode 100644 index 9c6a1b0f6..000000000 --- a/aikido_zen/importhook/registry.py +++ /dev/null @@ -1,41 +0,0 @@ -import sys - - -class Hooks(set): - """Custom set that is used to maintain and call a list of hooks""" - - def __call__(self, module): - for hook in self: - mod = hook(module) - # If they modified the module, then use that instead - if mod is not None: - module = mod - return module - - -class HookRegistry(dict): - """ - Class used as the registry for import hooks - """ - - def __setitem__(self, key, hook): - module_name = key or "ANY_MODULE" - - # Ensure we have a key for this module and it's value is a `Hooks` set - if key not in self: - super(HookRegistry, self).__setitem__(key, Hooks()) - - # Add our hook to the registry - self[key].add(hook) - - # Call hook for a module which has already been loaded - if key is not None and key in sys.modules: - module = sys.modules[key] - - module = hook(sys.modules[key]) - if module is not None: - sys.modules[key] = module - - -# Create our global registry -registry = HookRegistry() diff --git a/aikido_zen/importhook/utils.py b/aikido_zen/importhook/utils.py deleted file mode 100644 index b3d242804..000000000 --- a/aikido_zen/importhook/utils.py +++ /dev/null @@ -1,5 +0,0 @@ -def get_module_name(module): - """Helper function to get a module's name""" - if hasattr(module, "__spec__"): - return module.__spec__.name - return module.__name__ diff --git a/aikido_zen/sinks/__init__.py b/aikido_zen/sinks/__init__.py index e69de29bb..8e933b62b 100644 --- a/aikido_zen/sinks/__init__.py +++ b/aikido_zen/sinks/__init__.py @@ -0,0 +1,117 @@ +from wrapt import wrap_object, FunctionWrapper, when_imported + +from aikido_zen.background_process.packages import ANY_VERSION, is_package_compatible +from aikido_zen.errors import AikidoException +from aikido_zen.helpers.logging import logger + + +def on_import(name, package="", version_requirement=ANY_VERSION): + """ + Decorator to register a function to be called when a package is imported. + It checks if the package is compatible with the specified version requirement. + """ + + def decorator(func): + def check_pkg_wrapper(f): + def wrapper(*args, **kwargs): + # This code runs only on import + if package and not is_package_compatible(package, version_requirement): + return + return f(*args, **kwargs) + + return wrapper + + # Register the function to be called on import + when_imported(name)(check_pkg_wrapper(func)) + + return decorator + + +def patch_function(module, name, wrapper): + """ + Patches a function in the specified module with a wrapper function. + """ + try: + wrap_object(module, name, FunctionWrapper, (wrapper,)) + except Exception as e: + logger.info("Failed to wrap %s:%s, due to: %s", module, name, e) + + +def before(wrapper): + """ + Surrounds a patch with try-except and calls the original function at the end + """ + + def decorator(func, instance, args, kwargs): + try: + wrapper(func, instance, args, kwargs) # Call the patch + except AikidoException as e: + raise e # Re-raise AikidoException + except Exception as e: + logger.debug( + "%s:%s wrapping-before error: %s", func.__module__, func.__name__, e + ) + return func(*args, **kwargs) # Call the original function + + return decorator + + +def before_async(wrapper): + """ + Surrounds an async patch with try-except and calls the original asynchronous function at the end + """ + + async def decorator(func, instance, args, kwargs): + try: + await wrapper(func, instance, args, kwargs) # Call the patch + except AikidoException as e: + raise e # Re-raise AikidoException + except Exception as e: + logger.debug( + "%s:%s wrapping-before error: %s", func.__module__, func.__name__, e + ) + return await func(*args, **kwargs) # Call the original function + + return decorator + + +def before_modify_return(wrapper): + """ + Surrounds a patch with try-except and calls the original function at the end unless a return value is present. + """ + + def decorator(func, instance, args, kwargs): + try: + rv = wrapper(func, instance, args, kwargs) # Call the patch + if rv is not None: + return rv + except AikidoException as e: + raise e # Re-raise AikidoException + except Exception as e: + logger.debug( + "%s:%s wrapping-before error: %s", func.__module__, func.__name__, e + ) + return func(*args, **kwargs) # Call the original function + + return decorator + + +def after(wrapper): + """ + Surrounds a patch with try-except, calls the original function and gives the return value to the patch + """ + + def decorator(func, instance, args, kwargs): + return_value = func(*args, **kwargs) # Call the original function + try: + wrapper(func, instance, args, kwargs, return_value) # Call the patch + except AikidoException as e: + raise e # Re-raise AikidoException + except Exception as e: + logger.debug( + "%s:%s wrapping-after error: %s", func.__module__, func.__name__, e + ) + + return return_value + + return decorator diff --git a/aikido_zen/sinks/asyncpg.py b/aikido_zen/sinks/asyncpg.py index bfca59fc0..3c24de653 100644 --- a/aikido_zen/sinks/asyncpg.py +++ b/aikido_zen/sinks/asyncpg.py @@ -2,64 +2,28 @@ Sink module for `asyncpg` """ -import copy -import aikido_zen.importhook as importhook -from aikido_zen.background_process.packages import is_package_compatible import aikido_zen.vulnerabilities as vulns -from aikido_zen.helpers.logging import logger +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import patch_function, before, on_import -REQUIRED_ASYNCPG_VERSION = "0.27.0" - -@importhook.on_import("asyncpg.connection") -def on_asyncpg_import(asyncpg): +@on_import("asyncpg.connection", "asyncpg", version_requirement="0.27.0") +def patch(m): """ - Hook 'n wrap on `asyncpg.connection` - * the Cursor classes in asyncpg.cursor are only used to fetch data. (Currently not supported) - * Pool class uses Connection class (Wrapping supported for Connection class) - * _execute(...) get's called by all except execute and executemany - Our goal is to wrap the _execute(), execute(), executemany() functions in Connection class : - https://github.com/MagicStack/asyncpg/blob/85d7eed40637e7cad73a44ed2439ffeb2a8dc1c2/asyncpg/connection.py#L43 - Returns : Modified asyncpg.connection object + patching module asyncpg.connection + - patches Connection.execute, Connection.executemany, Connection._execute + - doesn't patch Cursor class -> are only used to fetch data. + - doesn't patch Pool class -> uses Connection class + src: https://github.com/MagicStack/asyncpg/blob/85d7eed40637e7cad73a44ed2439ffeb2a8dc1c2/asyncpg/connection.py#L43 """ - if not is_package_compatible("asyncpg", REQUIRED_ASYNCPG_VERSION): - return asyncpg - modified_asyncpg = importhook.copy_module(asyncpg) - - # pylint: disable=protected-access # We need to wrap this function - former__execute = copy.deepcopy(asyncpg.Connection._execute) - former_executemany = copy.deepcopy(asyncpg.Connection.executemany) - former_execute = copy.deepcopy(asyncpg.Connection.execute) - - def aikido_new__execute(_self, query, *args, **kwargs): - vulns.run_vulnerability_scan( - kind="sql_injection", - op="asyncpg.connection.Connection._execute", - args=(query, "postgres"), - ) - - return former__execute(_self, query, *args, **kwargs) - - def aikido_new_executemany(_self, query, *args, **kwargs): - # This query is just a string, not a list, see docs. - vulns.run_vulnerability_scan( - kind="sql_injection", - op="asyncpg.connection.Connection.executemany", - args=(query, "postgres"), - ) - return former_executemany(_self, query, *args, **kwargs) + patch_function(m, "Connection.execute", _execute) + patch_function(m, "Connection.executemany", _execute) + patch_function(m, "Connection._execute", _execute) - def aikido_new_execute(_self, query, *args, **kwargs): - vulns.run_vulnerability_scan( - kind="sql_injection", - op="asyncpg.connection.Connection.execute", - args=(query, "postgres"), - ) - return former_execute(_self, query, *args, **kwargs) - # pylint: disable=no-member - setattr(asyncpg.Connection, "_execute", aikido_new__execute) - setattr(asyncpg.Connection, "executemany", aikido_new_executemany) - setattr(asyncpg.Connection, "execute", aikido_new_execute) +@before +def _execute(func, instance, args, kwargs): + query = get_argument(args, kwargs, 0, "query") - return modified_asyncpg + op = f"asyncpg.connection.Connection.{func.__name__}" + vulns.run_vulnerability_scan(kind="sql_injection", op=op, args=(query, "postgres")) diff --git a/aikido_zen/sinks/builtins.py b/aikido_zen/sinks/builtins.py index 70167e45b..c1dd54da0 100644 --- a/aikido_zen/sinks/builtins.py +++ b/aikido_zen/sinks/builtins.py @@ -3,34 +3,26 @@ """ from pathlib import PurePath -import aikido_zen.importhook as importhook import aikido_zen.vulnerabilities as vulns +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import patch_function, on_import, before -def aikido_open_decorator(func): - """Decorator for open(...)""" +@before +def _open(func, instance, args, kwargs): + filename = get_argument(args, kwargs, 0, "filename") + if not isinstance(filename, (str, bytes, PurePath)): + return - def wrapper(*args, **kwargs): - # args[0] is thefunc_name filename - if len(args) > 0 and isinstance(args[0], (str, bytes, PurePath)): - vulns.run_vulnerability_scan( - kind="path_traversal", op="builtins.open", args=(args[0],) - ) - return func(*args, **kwargs) + vulns.run_vulnerability_scan( + kind="path_traversal", op="builtins.open", args=(filename,) + ) - return wrapper - -@importhook.on_import("builtins") -def on_builtins_import(builtins): +@on_import("builtins") +def patch(m): """ - Hook 'n wrap on `builtins`, python's built-in functions - Our goal is to wrap the open() function, which you use when opening files - Returns : Modified builtins object + patching module builtins + - patches builtins.open """ - modified_builtins = importhook.copy_module(builtins) - - # pylint: disable=no-member - setattr(builtins, "open", aikido_open_decorator(builtins.open)) - setattr(modified_builtins, "open", aikido_open_decorator(builtins.open)) - return modified_builtins + patch_function(m, "open", _open) diff --git a/aikido_zen/sinks/http_client.py b/aikido_zen/sinks/http_client.py index f41203966..5b9d22a4a 100644 --- a/aikido_zen/sinks/http_client.py +++ b/aikido_zen/sinks/http_client.py @@ -2,49 +2,33 @@ Sink module for `http` """ -import copy -import aikido_zen.importhook as importhook -from aikido_zen.helpers.logging import logger -from aikido_zen.vulnerabilities import run_vulnerability_scan +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import before, after, patch_function, on_import from aikido_zen.vulnerabilities.ssrf.handle_http_response import ( handle_http_response, ) from aikido_zen.helpers.try_parse_url import try_parse_url -from aikido_zen.errors import AikidoException -@importhook.on_import("http.client") -def on_http_import(http): - """ - Hook 'n wrap on `http.client.HTTPConnection.putrequest` - Our goal is to wrap the putrequest() function of the HTTPConnection class : - https://github.com/python/cpython/blob/372df1950817dfcf8b9bac099448934bf8657cf5/Lib/http/client.py#L1136 - Returns : Modified http.client object - """ - modified_http = importhook.copy_module(http) - former_putrequest = copy.deepcopy(http.HTTPConnection.putrequest) - former_getresponse = copy.deepcopy(http.HTTPConnection.getresponse) +@before +def _putrequest(func, instance, args, kwargs): + path = get_argument(args, kwargs, 1, "path") + setattr(instance, "_aikido_var_path", path) + - def aik_new_putrequest(_self, method, path, *args, **kwargs): - # Aikido putrequest, gets called before the request goes through - # Set path for aik_new_getresponse : - _self.aikido_attr_path = path - return former_putrequest(_self, method, path, *args, **kwargs) +@after +def _getresponse(func, instance, args, kwargs, return_value): + path = getattr(instance, "_aikido_var_path") + source_url = try_parse_url(f"http://{instance.host}:{instance.port}{path}") + handle_http_response(http_response=return_value, source=source_url) - def aik_new_getresponse(_self): - # Aikido getresponse, gets called after the request is complete - # And fetches the response - response = former_getresponse(_self) - try: - assembled_url = f"http://{_self.host}:{_self.port}{_self.aikido_attr_path}" - source_url = try_parse_url(assembled_url) - handle_http_response(http_response=response, source=source_url) - except Exception as e: - logger.debug("Exception occurred in custom getresponse function : %s", e) - return response - # pylint: disable=no-member - setattr(http.HTTPConnection, "putrequest", aik_new_putrequest) - # pylint: disable=no-member - setattr(http.HTTPConnection, "getresponse", aik_new_getresponse) - return modified_http +@on_import("http.client") +def patch(m): + """ + patching module http.client + - patches HTTPConnection.putrequest -> stores path + - patches HTTPConnection.getresponse -> handles response object + """ + patch_function(m, "HTTPConnection.putrequest", _putrequest) + patch_function(m, "HTTPConnection.getresponse", _getresponse) diff --git a/aikido_zen/sinks/io.py b/aikido_zen/sinks/io.py index 15966189b..48d543080 100644 --- a/aikido_zen/sinks/io.py +++ b/aikido_zen/sinks/io.py @@ -2,34 +2,35 @@ Sink module for python's `io` """ -import copy -import aikido_zen.importhook as importhook import aikido_zen.vulnerabilities as vulns +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import patch_function, before, on_import -KIND = "path_traversal" +@before +def _open(func, instance, args, kwargs): + file = get_argument(args, kwargs, 0, "file") + if not file: + return + + vulns.run_vulnerability_scan(kind="path_traversal", op="io.open", args=(file,)) -@importhook.on_import("io") -def on_io_import(io): - """ - Hook 'n wrap on `io`, wrapping io.open(...) and io.open_code(...) - Returns : Modified io object - """ - modified_io = importhook.copy_module(io) - former_open_func = copy.deepcopy(io.open) - former_open_code_func = copy.deepcopy(io.open_code) - def aikido_open_func(file, *args, **kwargs): - if file: - vulns.run_vulnerability_scan(kind=KIND, op="io.open", args=(file,)) - return former_open_func(file, *args, **kwargs) +@before +def _open_code(func, instance, args, kwargs): + path = get_argument(args, kwargs, 0, "path") + if not path: + return - def aikido_open_code_func(path): - if path: - vulns.run_vulnerability_scan(kind=KIND, op="io.open_code", args=(path,)) - return former_open_code_func(path) + vulns.run_vulnerability_scan(kind="path_traversal", op="io.open_code", args=(path,)) - setattr(modified_io, "open", aikido_open_func) - setattr(modified_io, "open_code", aikido_open_code_func) - return modified_io +@on_import("io") +def patch(m): + """ + patching module io + - patches io.open(file, ...) + - patches io.open_code(path) + """ + patch_function(m, "open", _open) + patch_function(m, "open_code", _open_code) diff --git a/aikido_zen/sinks/mysqlclient.py b/aikido_zen/sinks/mysqlclient.py index ca712aca3..5de3b91ff 100644 --- a/aikido_zen/sinks/mysqlclient.py +++ b/aikido_zen/sinks/mysqlclient.py @@ -2,43 +2,38 @@ Sink module for `mysqlclient` """ -import copy -import aikido_zen.importhook as importhook -from aikido_zen.background_process.packages import is_package_compatible -from aikido_zen.helpers.logging import logger +from aikido_zen.helpers.get_argument import get_argument import aikido_zen.vulnerabilities as vulns +from aikido_zen.sinks import patch_function, on_import, before -REQUIRED_MYSQLCLIENT_VERSION = "1.5.0" - -@importhook.on_import("MySQLdb.cursors") -def on_mysqlclient_import(mysql): +@on_import("MySQLdb.cursors", "mysqlclient", version_requirement="1.5.0") +def patch(m): """ - Hook 'n wrap on `MySQLdb.cursors` - Our goal is to wrap the query() function of the Connection class : - https://github.com/PyMySQL/mysqlclient/blob/9fd238b9e3105dcbed2b009a916828a38d1f0904/src/MySQLdb/connections.py#L257 - Returns : Modified MySQLdb.connections object + patching MySQLdb.cursors (mysqlclient) + - patches Cursor.execute(query, ...) + - patches Cursor.executemany(query, ...) """ - if not is_package_compatible("mysqlclient", REQUIRED_MYSQLCLIENT_VERSION): - return mysql - modified_mysql = importhook.copy_module(mysql) - prev_execute_func = copy.deepcopy(mysql.Cursor.execute) - prev_executemany_func = copy.deepcopy(mysql.Cursor.executemany) - - def aikido_new_execute(self, query, args=None): - if isinstance(query, bytearray): - logger.debug("Query is bytearray, normally comes from executemany.") - return prev_execute_func(self, query, args) - vulns.run_vulnerability_scan( - kind="sql_injection", op="MySQLdb.Cursor.execute", args=(query, "mysql") - ) - return prev_execute_func(self, query, args) - - def aikido_new_executemany(self, query, args): - op = "MySQLdb.Cursor.executemany" - vulns.run_vulnerability_scan(kind="sql_injection", op=op, args=(query, "mysql")) - return prev_executemany_func(self, query, args) - - setattr(mysql.Cursor, "execute", aikido_new_execute) - setattr(mysql.Cursor, "executemany", aikido_new_executemany) - return modified_mysql + patch_function(m, "Cursor.execute", _execute) + patch_function(m, "Cursor.executemany", _executemany) + + +@before +def _execute(func, instance, args, kwargs): + query = get_argument(args, kwargs, 0, "query") + if isinstance(query, bytearray): + # If query is type bytearray, it will be picked up by our wrapping of executemany + return + + vulns.run_vulnerability_scan( + kind="sql_injection", op="MySQLdb.Cursor.execute", args=(query, "mysql") + ) + + +@before +def _executemany(func, instance, args, kwargs): + query = get_argument(args, kwargs, 0, "query") + + vulns.run_vulnerability_scan( + kind="sql_injection", op="MySQLdb.Cursor.executemany", args=(query, "mysql") + ) diff --git a/aikido_zen/sinks/os.py b/aikido_zen/sinks/os.py index 9cf4f8809..5c4cdc223 100644 --- a/aikido_zen/sinks/os.py +++ b/aikido_zen/sinks/os.py @@ -2,78 +2,55 @@ Sink module for python's `os` """ -import copy from pathlib import PurePath -import aikido_zen.importhook as importhook import aikido_zen.vulnerabilities as vulns +from aikido_zen.sinks import before, patch_function, on_import -# os.func(...) functions, can have a filename and destination. -OS_FILE_FUNCTIONS = [ - "access", - "chmod", - "chown", - "mkdir", - "listdir", - "readlink", - "unlink", - "rename", - "rmdir", - "remove", - "symlink", - "link", - "walk", - "open", -] -# os.path.realpath, os.path.abspath aren't wrapped, since they use os.path.join -OS_PATH_FUNCTIONS = ["getsize", "join", "expanduser", "expandvars"] +@before +def _os_patch(func, instance, args, kwargs): + possible_paths = args + tuple(kwargs.values()) + for path in possible_paths: + if not isinstance(path, (str, bytes, PurePath)): + continue + # change op if it's an os.path function + op = f"os.{func.__name__}" + if func.__name__ in ("getsize", "join", "expanduser", "expandvars", "realpath"): + op = f"os.path.{func.__name__}" -# os.makedirs() is not wrapped since it uses os.mkdir() which we wrap -# os.path.exists() and functions alike are not wrapped for performance reasons. -# We also don't wrap the stat library : https://docs.python.org/3/library/stat.html + vulns.run_vulnerability_scan(kind="path_traversal", op=op, args=(path,)) -def generate_aikido_function(op, former_func): +@on_import("os") +def patch(m): """ - Returns a generated aikido function given an operation - and the previous function + patching module os + - patches os.* functions that take in paths + - patches os.path.* functions that take in paths + - doesn't patch os.makedirs -> uses os.mkdir + - doesn't patch os.path.realpath or os.path.abspath -> uses os.path.join + - doesn't patch os.path.exists and others -> to big of a performance impact + - doesn't patch stat library https://docs.python.org/3/library/stat.html """ - - def aikido_new_func(*args, op=op, former_func=former_func, **kwargs): - for arg in args: - if isinstance(arg, (str, bytes, PurePath)): - vulns.run_vulnerability_scan( - kind="path_traversal", op=f"os.{op}", args=(arg,) - ) - return former_func(*args, **kwargs) - - return aikido_new_func - - -@importhook.on_import("os") -def on_os_import(os): - """ - Hook 'n wrap on `os` module, wrapping os.func(...) and os.path.func(...) - Returns : Modified os object - """ - modified_os = importhook.copy_module(os) - for op in OS_FILE_FUNCTIONS: - # Wrap os. functions - if not hasattr(os, op): - continue # Don't wrap methods that are specific to the OS (e.g. chown) - former_func = copy.deepcopy(getattr(os, op)) - aikido_new_func = generate_aikido_function(op, former_func) - setattr(os, op, aikido_new_func) - setattr(modified_os, op, aikido_new_func) - - for op in OS_PATH_FUNCTIONS: - # Wrap os.path functions - if not hasattr(os.path, op): - continue # Don't wrap methods that are specific to the OS - former_func = copy.deepcopy(getattr(os.path, op)) - aikido_new_func = generate_aikido_function(f"path.{op}", former_func) - setattr(os.path, op, aikido_new_func) - # pylint: disable=no-member - setattr(modified_os.path, op, aikido_new_func) - - return modified_os + # os.*(...) patches + patch_function(m, "access", _os_patch) + patch_function(m, "chmod", _os_patch) + patch_function(m, "chown", _os_patch) + patch_function(m, "mkdir", _os_patch) + patch_function(m, "listdir", _os_patch) + patch_function(m, "readlink", _os_patch) + patch_function(m, "unlink", _os_patch) + patch_function(m, "rename", _os_patch) + patch_function(m, "rmdir", _os_patch) + patch_function(m, "remove", _os_patch) + patch_function(m, "symlink", _os_patch) + patch_function(m, "link", _os_patch) + patch_function(m, "walk", _os_patch) + patch_function(m, "open", _os_patch) + + # os.path.*(...) patches + patch_function(m, "path.getsize", _os_patch) + patch_function(m, "path.join", _os_patch) + patch_function(m, "path.expanduser", _os_patch) + patch_function(m, "path.expandvars", _os_patch) + patch_function(m, "path.realpath", _os_patch) # Python 3.13 diff --git a/aikido_zen/sinks/os_system.py b/aikido_zen/sinks/os_system.py index 942973b07..52d7887bc 100644 --- a/aikido_zen/sinks/os_system.py +++ b/aikido_zen/sinks/os_system.py @@ -2,28 +2,28 @@ Sink module for `os`, wrapping os.system """ -import aikido_zen.importhook as importhook import aikido_zen.vulnerabilities as vulns +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import patch_function, before, on_import -@importhook.on_import("os") -def on_os_import(os): - """ - Hook 'n wrap on `os.system()` function - Returns : Modified os object - We don't wrap os.popen() since this command uses subprocess.Popen, which we - already wrap and protect in the subprocess.py sink. - We also don't wrap os.execl, os.execle, os.execlp, ... because these should only be vulnerable - to argument injection, which we currently don't protect against. - """ - modified_os = importhook.copy_module(os) +@before +def _system(func, instance, args, kwargs): + command = get_argument(args, kwargs, 0, "command") + if not isinstance(command, str): + return + + vulns.run_vulnerability_scan( + kind="shell_injection", op="os.system", args=(command,) + ) - def aikido_new_system(command, *args, **kwargs): - if isinstance(command, str): - vulns.run_vulnerability_scan( - kind="shell_injection", op="os.system", args=(command,) - ) - return os.system(command, *args, **kwargs) - setattr(modified_os, "system", aikido_new_system) - return modified_os +@on_import("os") +def patch(m): + """ + patching os module + - patches os.system for shell injection + - does not patch: os.popen -> uses subprocess.Popen + - does not patch: os.execl, os.execle, os.execlp, ... -> only argument injection + """ + patch_function(m, "system", _system) diff --git a/aikido_zen/sinks/psycopg.py b/aikido_zen/sinks/psycopg.py index 18672c869..2ea4dd66e 100644 --- a/aikido_zen/sinks/psycopg.py +++ b/aikido_zen/sinks/psycopg.py @@ -2,50 +2,34 @@ Sink module for `psycopg` """ -import copy -import aikido_zen.importhook as importhook -from aikido_zen.background_process.packages import is_package_compatible import aikido_zen.vulnerabilities as vulns +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import patch_function, on_import, before -REQUIRED_PSYCOPG_VERSION = "3.1.0" - -@importhook.on_import("psycopg.cursor") -def on_psycopg_import(psycopg): +@on_import("psycopg.cursor", "psycopg", version_requirement="3.1.0") +def patch(m): """ - Hook 'n wrap on `psycopg.connect` function, we modify the cursor_factory - of the result of this connect function. + patching module psycopg.cursor + - patches Cursor.copy + - patches Cursor.execute + - patches Cursor.executemany """ - if not is_package_compatible("psycopg", REQUIRED_PSYCOPG_VERSION): - return psycopg - modified_psycopg = importhook.copy_module(psycopg) - former_copy_funtcion = copy.deepcopy(psycopg.Cursor.copy) - former_execute_function = copy.deepcopy(psycopg.Cursor.execute) - former_executemany_function = copy.deepcopy(psycopg.Cursor.executemany) - - def aikido_copy(self, statement, params=None, *args, **kwargs): - sql = statement - vulns.run_vulnerability_scan( - kind="sql_injection", op="psycopg.Cursor.copy", args=(sql, "postgres") - ) - return former_copy_funtcion(self, statement, params, *args, **kwargs) + patch_function(m, "Cursor.copy", _copy) + patch_function(m, "Cursor.execute", _execute) + patch_function(m, "Cursor.executemany", _execute) - def aikido_execute(self, query, params=None, *args, **kwargs): - sql = query - vulns.run_vulnerability_scan( - kind="sql_injection", op="psycopg.Cursor.execute", args=(sql, "postgres") - ) - return former_execute_function(self, query, params, *args, **kwargs) - def aikido_executemany(self, query, params_seq): - args = (query, "postgres") - op = "psycopg.Cursor.executemany" - vulns.run_vulnerability_scan(kind="sql_injection", op=op, args=args) - return former_executemany_function(self, query, params_seq) +@before +def _copy(func, instance, args, kwargs): + statement = get_argument(args, kwargs, 0, "statement") + vulns.run_vulnerability_scan( + kind="sql_injection", op="psycopg.Cursor.copy", args=(statement, "postgres") + ) - setattr(psycopg.Cursor, "copy", aikido_copy) # pylint: disable=no-member - setattr(psycopg.Cursor, "execute", aikido_execute) # pylint: disable=no-member - # pylint: disable=no-member - setattr(psycopg.Cursor, "executemany", aikido_executemany) - return modified_psycopg +@before +def _execute(func, instance, args, kwargs): + query = get_argument(args, kwargs, 0, "query") + op = f"psycopg.Cursor.{func.__name__}" + vulns.run_vulnerability_scan(kind="sql_injection", op=op, args=(query, "postgres")) diff --git a/aikido_zen/sinks/psycopg2.py b/aikido_zen/sinks/psycopg2.py index afd5a0fe5..85bb3148c 100644 --- a/aikido_zen/sinks/psycopg2.py +++ b/aikido_zen/sinks/psycopg2.py @@ -2,68 +2,56 @@ Sink module for `psycopg2` """ -import copy -import aikido_zen.importhook as importhook from aikido_zen.background_process.packages import is_package_compatible import aikido_zen.vulnerabilities as vulns +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import on_import, before, patch_function, after -PSYCOPG2_REQUIRED_VERSION = "2.9.2" +@on_import("psycopg2") +def patch(m): + """ + patching module psycopg2 + - patches psycopg2.connect + Warning: cannot set 'execute' attribute of immutable type 'psycopg2.extensions.cursor' + """ + compatible = is_package_compatible( + required_version="2.9.2", packages=["psycopg2", "psycopg2-binary"] + ) + if not compatible: + # Users can install either psycopg2 or psycopg2-binary, we need to check if at least + # one is installed and if they meet version requirements + return -def wrap_cursor_factory(cursor_factory): - former_cursor_factory = copy.deepcopy(cursor_factory) - import psycopg2.extensions as ext - - class AikidoWrappedCursor(ext.cursor): - def execute(self, *args, **kwargs): - """Aikido's wrapped execute function""" - vulns.run_vulnerability_scan( - kind="sql_injection", - op="psycopg2.Connection.Cursor.execute", - args=(args[0], "postgres"), # args[0] : sql - ) - if former_cursor_factory and hasattr(former_cursor_factory, "execute"): - return former_cursor_factory.execute(self, *args, **kwargs) - return ext.cursor.execute(self, *args, **kwargs) - - def executemany(self, *args, **kwargs): - """Aikido's wrapped executemany function""" - sql = args[0] # The data is double, but sql only once. - vulns.run_vulnerability_scan( - kind="sql_injection", - op="psycopg2.Connection.Cursor.executemany", - args=(sql, "postgres"), - ) - if former_cursor_factory and hasattr(former_cursor_factory, "executemany"): - return former_cursor_factory.executemany(self, *args, **kwargs) - return ext.cursor.executemany(self, *args, **kwargs) - - return AikidoWrappedCursor + patch_function(m, "connect", _connect) -@importhook.on_import("psycopg2") -def on_psycopg2_import(psycopg2): +@after +def _connect(func, instance, _args, _kwargs, rv): """ - Hook 'n wrap on `psycopg2.connect` function, we modify the cursor_factory - of the result of this connect function. + the return value (rv) is the new connection object, we'll change the cursor_factory attribute here. """ - # Users can install either psycopg2 or psycopg2-binary, we need to check if at least - # one is installed and if they meet version requirements : - if not is_package_compatible( - required_version=PSYCOPG2_REQUIRED_VERSION, - packages=["psycopg2", "psycopg2-binary"], - ): - # Both psycopg2 and psycopg2-binary are not supported, don't wrapping - return psycopg2 - modified_psycopg2 = importhook.copy_module(psycopg2) - former_connect_function = copy.deepcopy(psycopg2.connect) - - def aikido_connect(*args, **kwargs): - former_conn = former_connect_function(*args, **kwargs) - former_conn.cursor_factory = wrap_cursor_factory(former_conn.cursor_factory) - return former_conn - - # pylint: disable=no-member - setattr(psycopg2, "connect", aikido_connect) - setattr(modified_psycopg2, "connect", aikido_connect) - return modified_psycopg2 + if rv.cursor_factory is None: + # set default if not set + import psycopg2.extensions + + rv.cursor_factory = psycopg2.extensions.cursor + + rv.cursor_factory = type( + "AikidoPsycopg2Cursor", + (rv.cursor_factory,), + { + # Allows us to modify these otherwise immutable functions + "execute": rv.cursor_factory.execute, + "executemany": rv.cursor_factory.executemany, + }, + ) + patch_function(rv.cursor_factory, "execute", psycopg2_patch) + patch_function(rv.cursor_factory, "executemany", psycopg2_patch) + + +@before +def psycopg2_patch(func, instance, args, kwargs): + query = get_argument(args, kwargs, 0, "query") + op = f"psycopg2.Connection.Cursor.{func.__name__}" + vulns.run_vulnerability_scan(kind="sql_injection", op=op, args=(query, "postgres")) diff --git a/aikido_zen/sinks/pymongo.py b/aikido_zen/sinks/pymongo.py index 0db9bebe4..fa1065a90 100644 --- a/aikido_zen/sinks/pymongo.py +++ b/aikido_zen/sinks/pymongo.py @@ -2,92 +2,98 @@ Sink module for `pymongo` """ -from copy import deepcopy -import aikido_zen.importhook as importhook -from aikido_zen.helpers.logging import logger -import aikido_zen.background_process.packages as pkgs +from aikido_zen.helpers.get_argument import get_argument import aikido_zen.vulnerabilities as vulns +from . import patch_function, on_import, before -# find_one not present in list since find_one calls find function. - -OPERATIONS_WITH_FILTER = [ - ("replace_one", [0, "filter"]), - ("update_one", [0, "filter"]), - ("update_many", [0, "filter"]), - ("delete_one", [0, "filter"]), - ("delete_many", [0, "filter"]), - ("count_documents", [0, "filter"]), - ("find_one_and_delete", [0, "filter"]), - ("find_one_and_replace", [0, "filter"]), - ("find_one_and_update", [0, "filter"]), - ("find", [0, "filter"]), - ("find_raw_batches", [0, "filter"]), - ("distinct", [1, "filter"]), - ("watch", [0, "pipeline"]), - ("aggregate", [0, "pipeline"]), - ("aggregate_raw_batches", [0, "pipeline"]), -] - -REQUIRED_PYMONGO_VERSION = "3.10.0" - - -# Synchronous : -@importhook.on_import("pymongo.collection") -def on_pymongo_import(pymongo): + +@on_import("pymongo.collection", "pymongo", version_requirement="3.10.0") +def patch(m): """ - Hook 'n wrap on `pymongo.collection` - Our goal is to wrap the following functions in the Collection class : - https://github.com/mongodb/mongo-python-driver/blob/98658cfd1fea42680a178373333bf27f41153759/pymongo/synchronous/collection.py#L136 - Returns : Modified pymongo.collection.Collection object + patching pymongo.collection + - patches Collection.*(filter, ...) + - patches Collection.*(..., filter, ...) + - patches Collection.*(pipeline, ...) + - patches Collection.bulk_write + src: https://github.com/mongodb/mongo-python-driver/blob/98658cfd1fea42680a178373333bf27f41153759/pymongo/synchronous/collection.py#L136 """ - if not pkgs.is_package_compatible("pymongo", REQUIRED_PYMONGO_VERSION): - return pymongo - modified_pymongo = importhook.copy_module(pymongo) - for op_data in OPERATIONS_WITH_FILTER: - op = op_data[0] - if not hasattr(pymongo.Collection, op): - logger.warning("Operation `%s` not found on Collection object.", op) - - prev_func = deepcopy(getattr(pymongo.Collection, op)) - - def wrapped_op_func( - self, - *args, - prev_func=prev_func, - op_data=op_data, - **kwargs, - ): - op, spot, key = op_data[0], op_data[1][0], op_data[1][1] - data = None - if kwargs.get(key, None): - # Keyword found, setting data - data = kwargs.get(key) - elif len(args) > spot and args[spot]: - data = args[spot] - if data: - vulns.run_vulnerability_scan( - kind="nosql_injection", - op=f"pymongo.collection.Collection.{op}", - args=(data,), - ) - - return prev_func(self, *args, **kwargs) - - setattr(modified_pymongo.Collection, op, wrapped_op_func) - - # Add bulk_write support : - former_bulk_write = deepcopy(pymongo.Collection.bulk_write) - - def aikido_bulk_write(self, requests, *args, **kwargs): - for request in requests: - if hasattr(request, "_filter"): - # Requested operation has a filter - vulns.run_vulnerability_scan( - kind="nosql_injection", - op="pymongo.collection.Collection.bulk_write", - args=(request._filter,), - ) - return former_bulk_write(self, requests, *args, **kwargs) - - setattr(modified_pymongo.Collection, "bulk_write", aikido_bulk_write) - return modified_pymongo + # func(filter, ...) + patch_function(m, "Collection.replace_one", _func_filter_first) + patch_function(m, "Collection.update_one", _func_filter_first) + patch_function(m, "Collection.update_many", _func_filter_first) + patch_function(m, "Collection.delete_one", _func_filter_first) + patch_function(m, "Collection.delete_many", _func_filter_first) + patch_function(m, "Collection.count_documents", _func_filter_first) + patch_function(m, "Collection.find_one_and_delete", _func_filter_first) + patch_function(m, "Collection.find_one_and_replace", _func_filter_first) + patch_function(m, "Collection.find_one_and_update", _func_filter_first) + patch_function(m, "Collection.find", _func_filter_first) + patch_function(m, "Collection.find_raw_batches", _func_filter_first) + # find_one not present in list since find_one calls find function. + + # func(..., filter, ...) + patch_function(m, "Collection.distinct", _func_filter_second) + + # func(pipeline, ...) + patch_function(m, "Collection.watch", _func_pipeline) + patch_function(m, "Collection.aggregate", _func_pipeline) + patch_function(m, "Collection.aggregate_raw_batches", _func_pipeline) + + # bulk_write + patch_function(m, "Collection.bulk_write", _bulk_write) + + +@before +def _func_filter_first(func, instance, args, kwargs): + """Collection.func(filter, ...)""" + nosql_filter = get_argument(args, kwargs, 0, "filter") + if not nosql_filter: + return + + vulns.run_vulnerability_scan( + kind="nosql_injection", + op=f"pymongo.collection.Collection.{func.__name__}", + args=(nosql_filter,), + ) + + +@before +def _func_filter_second(func, instance, args, kwargs): + """Collection.func(..., filter, ...)""" + nosql_filter = get_argument(args, kwargs, 1, "filter") + if not nosql_filter: + return + + vulns.run_vulnerability_scan( + kind="nosql_injection", + op=f"pymongo.collection.Collection.{func.__name__}", + args=(nosql_filter,), + ) + + +@before +def _func_pipeline(func, instance, args, kwargs): + """Collection.func(pipeline, ...)""" + nosql_pipeline = get_argument(args, kwargs, 0, "pipeline") + if not nosql_pipeline: + return + + vulns.run_vulnerability_scan( + kind="nosql_injection", + op=f"pymongo.collection.Collection.{func.__name__}", + args=(nosql_pipeline,), + ) + + +@before +def _bulk_write(func, instance, args, kwargs): + requests = get_argument(args, kwargs, 0, "requests") + + # Filter requests that contain "_filter" + requests_with_filter = [req for req in requests if hasattr(req, "_filter")] + for request in requests_with_filter: + vulns.run_vulnerability_scan( + kind="nosql_injection", + op="pymongo.collection.Collection.bulk_write", + args=(request._filter,), + ) diff --git a/aikido_zen/sinks/pymysql.py b/aikido_zen/sinks/pymysql.py index ae1e5fdb1..c100039bc 100644 --- a/aikido_zen/sinks/pymysql.py +++ b/aikido_zen/sinks/pymysql.py @@ -2,47 +2,39 @@ Sink module for `pymysql` """ -import copy -import logging -import aikido_zen.importhook as importhook -from aikido_zen.background_process.packages import is_package_compatible import aikido_zen.vulnerabilities as vulns +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import patch_function, on_import, before -logger = logging.getLogger("aikido_zen") -REQUIRED_PYMYSQL_VERSION = "0.9.0" +@before +def _execute(func, instance, args, kwargs): + query = get_argument(args, kwargs, 0, "query") + if isinstance(query, bytearray): + # If query is type bytearray, it will be picked up by our wrapping of executemany + return + vulns.run_vulnerability_scan( + kind="sql_injection", op="pymysql.Cursor.execute", args=(query, "mysql") + ) -@importhook.on_import("pymysql.cursors") -def on_pymysql_import(mysql): + +@before +def _executemany(func, instance, args, kwargs): + query = get_argument(args, kwargs, 0, "query") + + vulns.run_vulnerability_scan( + kind="sql_injection", op="pymysql.Cursor.executemany", args=(query, "mysql") + ) + + +@on_import("pymysql.cursors", "pymysql", version_requirement="0.9.0") +def patch(m): """ - Hook 'n wrap on `pymysql.cursors` - Our goal is to wrap execute() and executemany() on Cursor class + patching `pymysql.cursors` + - patches Cursor.execute(query) + - patches Cursor.executemany(query) https://github.com/PyMySQL/PyMySQL/blob/95635f587ba9076e71a223b113efb08ac34a361d/pymysql/cursors.py#L133 - Returns : Modified pymysql.cursors object """ - if not is_package_compatible("pymysql", REQUIRED_PYMYSQL_VERSION): - return mysql - modified_mysql = importhook.copy_module(mysql) - - prev_execute_func = copy.deepcopy(mysql.Cursor.execute) - prev_executemany_func = copy.deepcopy(mysql.Cursor.executemany) - - def aikido_new_execute(self, query, args=None): - if isinstance(query, bytearray): - logger.debug("Query is bytearray, normally comes from executemany.") - return prev_execute_func(self, query, args) - vulns.run_vulnerability_scan( - kind="sql_injection", op="pymysql.Cursor.execute", args=(query, "mysql") - ) - return prev_execute_func(self, query, args) - - def aikido_new_executemany(self, query, args): - op = "pymysql.Cursor.executemany" - vulns.run_vulnerability_scan(kind="sql_injection", op=op, args=(query, "mysql")) - return prev_executemany_func(self, query, args) - - setattr(mysql.Cursor, "execute", aikido_new_execute) - setattr(mysql.Cursor, "executemany", aikido_new_executemany) - - return modified_mysql + patch_function(m, "Cursor.execute", _execute) + patch_function(m, "Cursor.executemany", _executemany) diff --git a/aikido_zen/sinks/shutil.py b/aikido_zen/sinks/shutil.py index 1e04e7c2a..6e4198b39 100644 --- a/aikido_zen/sinks/shutil.py +++ b/aikido_zen/sinks/shutil.py @@ -2,51 +2,32 @@ Sink module for python's `shutil` """ -import copy -import aikido_zen.importhook as importhook import aikido_zen.vulnerabilities as vulns +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import on_import, patch_function, before -# File functions func(src, dst, *, **) -SHUTIL_SRC_DST_FUNCTIONS = [ - "copymode", - "copystat", - "copytree", - "move", -] -# shutil.copyfile(src, dst, *, **) => builtins.open -# shutil.copy(src, dst, *, **) => builtins.open -# shutil.copy2(src, dst, *, **) => builtins.open +@before +def _shutil_func(func, instance, args, kwargs): + source = get_argument(args, kwargs, 0, "src") + destination = get_argument(args, kwargs, 1, "dst") -def generate_aikido_function(aik_op, func): - """ - Returns a generated aikido function given an operation - and the previous function - """ - - def wrapper(src, dst, *args, **kwargs): - kind = "path_traversal" - op = f"shutil.{aik_op}" - if src: - vulns.run_vulnerability_scan(kind, op, args=(src,)) - if dst: - vulns.run_vulnerability_scan(kind, op, args=(dst,)) - return func(src, dst, *args, **kwargs) + kind = "path_traversal" + op = f"shutil.{func.__name__}" + if isinstance(source, str): + vulns.run_vulnerability_scan(kind, op, args=(source,)) + if isinstance(source, str): + vulns.run_vulnerability_scan(kind, op, args=(destination,)) - return wrapper - -@importhook.on_import("shutil") -def on_shutil_import(shutil): +@on_import("shutil") +def patch(m): """ - Hook 'n wrap on `shutil`, python's built-in functions - Our goal is to wrap functions found in SHUTIL_SRC_DST_FUNCTIONS - Returns : Modified shutil object + patching module shutil + - patches: copymode, copystat, copytree, move + - does not patch: copyfile, copy, copy2 -> uses builtins.open """ - modified_shutil = importhook.copy_module(shutil) - for op in SHUTIL_SRC_DST_FUNCTIONS: - # Wrap shutil. functions - aikido_new_func = generate_aikido_function(op, getattr(shutil, op)) - setattr(modified_shutil, op, aikido_new_func) - - return modified_shutil + patch_function(m, "copymode", _shutil_func) + patch_function(m, "copystat", _shutil_func) + patch_function(m, "copytree", _shutil_func) + patch_function(m, "move", _shutil_func) diff --git a/aikido_zen/sinks/socket.py b/aikido_zen/sinks/socket.py index 5dfcb748a..fc613db19 100644 --- a/aikido_zen/sinks/socket.py +++ b/aikido_zen/sinks/socket.py @@ -2,47 +2,23 @@ Sink module for `socket` """ -import copy -import aikido_zen.importhook as importhook -from aikido_zen.helpers.logging import logger +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import on_import, patch_function, after from aikido_zen.vulnerabilities import run_vulnerability_scan -SOCKET_OPERATIONS = [ - "gethostbyname", - "gethostbyaddr", - "getaddrinfo", - "create_connection", -] +@after +def _getaddrinfo(func, instance, args, kwargs, return_value): + host = get_argument(args, kwargs, 0, "host") + port = get_argument(args, kwargs, 1, "port") + arguments = (return_value, host, port) # return_value = dns response + run_vulnerability_scan(kind="ssrf", op="socket.getaddrinfo", args=arguments) -def generate_aikido_function(former_func, op): - """ - Generates a new aikido function given a former function and op - """ - - def aik_new_func(*args, **kwargs): - res = former_func(*args, **kwargs) - if op == "getaddrinfo": - run_vulnerability_scan( - kind="ssrf", op="socket.getaddrinfo", args=(res, args[0], args[1]) - ) - return res - return aik_new_func - - -@importhook.on_import("socket") -def on_socket_import(socket): +@on_import("socket") +def patch(m): """ - Hook 'n wrap on `socket` - Our goal is to wrap the getaddrinfo socket function - https://github.com/python/cpython/blob/8f19be47b6a50059924e1d7b64277ad3cef4dac7/Lib/socket.py#L10 - Returns : Modified socket object + patching module socket + - patches getaddrinfo(host, port, ...) """ - modified_socket = importhook.copy_module(socket) - for op in SOCKET_OPERATIONS: - former_func = copy.deepcopy(getattr(socket, op)) - setattr(modified_socket, op, generate_aikido_function(former_func, op)) - setattr(socket, op, generate_aikido_function(former_func, op)) - - return modified_socket + patch_function(m, "getaddrinfo", _getaddrinfo) diff --git a/aikido_zen/sinks/subprocess.py b/aikido_zen/sinks/subprocess.py index 92c8b0a6d..2e20fbfbb 100644 --- a/aikido_zen/sinks/subprocess.py +++ b/aikido_zen/sinks/subprocess.py @@ -2,71 +2,42 @@ Sink module for `subprocess` """ -import copy -import aikido_zen.importhook as importhook import aikido_zen.vulnerabilities as vulns from aikido_zen.helpers.get_argument import get_argument - -SUBPROCESS_OPERATIONS = ["check_output"] -# check_call, call, and run all call Popen class - - -def generate_aikido_function(op, former_func): - """ - Generates an aikido shell function given - an operation and a former function - """ - - def aikido_new_func(*args, op=op, former_func=former_func, **kwargs): - shell_enabled = kwargs.get("shell") - - position = ( - 1 if op == "Popen" else 0 - ) # If it's a constructor, first argument is self - shell_arguments = get_argument(args, kwargs, pos=position, name="args") - - command = None - if isinstance(shell_arguments, str): - command = shell_arguments - elif hasattr(shell_arguments, "__iter__"): - # Check if args is an iterable i.e. list, dict, tuple - # If it is we join it with spaces to run the shell_injection algorithm. - command = " ".join(shell_arguments) - - # For all operations above: call, run, check_call, Popen, check_output, default value - # of the shell property is False. - if command and shell_enabled: - vulns.run_vulnerability_scan( - kind="shell_injection", - op=f"subprocess.{op}", - args=(command,), - ) - return former_func(*args, **kwargs) - - return aikido_new_func +from aikido_zen.sinks import on_import, patch_function, before + + +def try_join_iterable(iterable): + try: + return " ".join(iterable) + except Exception: + return None + + +@before +def _subprocess_init(func, instance, args, kwargs): + shell_arguments = get_argument(args, kwargs, 0, "args") + shell_enabled = get_argument(args, kwargs, 8, "shell") + if not shell_enabled: + return # default shell property is False, we only want to scan if it's True + + command = try_join_iterable(shell_arguments) + if isinstance(shell_arguments, str): + command = shell_arguments + if not command: + return + vulns.run_vulnerability_scan( + kind="shell_injection", + op=f"subprocess.Popen", + args=(command,), + ) -@importhook.on_import("subprocess") -def on_subprocess_import(subprocess): +@on_import("subprocess") +def patch(m): """ - Hook 'n wrap on `subproccess`, wrapping multiple functions - Returns : Modified subprocess object + patching subprocess module + - patches Popen.__init__ constructor + - does not patch: check_output, check_call, call, and run (call Popen class) """ - modified_subprocess = importhook.copy_module(subprocess) - for op in SUBPROCESS_OPERATIONS: - former_func = copy.deepcopy(getattr(subprocess, op)) - setattr( - modified_subprocess, - op, - generate_aikido_function(op=op, former_func=former_func), - ) - - # Wrap Class Popen seperately: - former_popen_constructor = copy.deepcopy(subprocess.Popen.__init__) - setattr( - getattr(modified_subprocess, "Popen"), - "__init__", # Popen is a class, modify it's constructor - generate_aikido_function(op="Popen", former_func=former_popen_constructor), - ) - - return modified_subprocess + patch_function(m, "Popen.__init__", _subprocess_init) diff --git a/aikido_zen/sinks/tests/__init__.py b/aikido_zen/sinks/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/aikido_zen/sinks/tests/os_test.py b/aikido_zen/sinks/tests/os_test.py index c3bd96489..fc55f66fc 100644 --- a/aikido_zen/sinks/tests/os_test.py +++ b/aikido_zen/sinks/tests/os_test.py @@ -13,9 +13,9 @@ def test_ospath_commands(): import os os.path.realpath("test/test2") - op = "os.path.join" + op = "os.path.realpath" args = ("test/test2",) - mock_run_vulnerability_scan.assert_called_with(kind=kind, op=op, args=args) + mock_run_vulnerability_scan.assert_any_call(kind=kind, op=op, args=args) with pytest.raises(FileNotFoundError): os.path.getsize("aqkqjefbkqlleq_qkvfjksaicuaviel") @@ -25,9 +25,9 @@ def test_ospath_commands(): mock_run_vulnerability_scan.assert_any_call(kind=kind, op=op, args=args) os.path.realpath(b"te2st/test2") - op = "os.path.join" + op = "os.path.realpath" args = (b"te2st/test2",) - mock_run_vulnerability_scan.assert_called_with(kind=kind, op=op, args=args) + mock_run_vulnerability_scan.assert_any_call(kind=kind, op=op, args=args) path1 = Path("./", "../", "test/../test2") with pytest.raises(FileNotFoundError): diff --git a/aikido_zen/sinks/tests/psycopg2_test.py b/aikido_zen/sinks/tests/psycopg2_test.py index 483475f74..f53844876 100644 --- a/aikido_zen/sinks/tests/psycopg2_test.py +++ b/aikido_zen/sinks/tests/psycopg2_test.py @@ -1,3 +1,5 @@ +import sys + import pytest from unittest.mock import patch import aikido_zen.sinks.psycopg2 @@ -6,22 +8,58 @@ kind = "sql_injection" op = "pymysql.connections.query" +# psycopg2 not working on python 3.13 for now +skip_python_3_13 = sys.version_info[:2] == (3, 13) + @pytest.fixture def database_conn(): import psycopg2 + from psycopg2.extras import DictCursor + + return psycopg2.connect( + cursor_factory=DictCursor, + host="127.0.0.1", + user="user", + password="password", + database="db", + ) + + +@pytest.fixture +def database_conn_immutable_cursor(): + import psycopg2 + from psycopg2.extensions import cursor return psycopg2.connect( - host="127.0.0.1", user="user", password="password", database="db" + cursor_factory=cursor, + host="127.0.0.1", + user="user", + password="password", + database="db", ) +@pytest.fixture +def database_conn_empty_cursor(): + import psycopg2 + + return psycopg2.connect( + host="127.0.0.1", + user="user", + password="password", + database="db", + ) + + +@pytest.mark.skipif(skip_python_3_13, reason="Skipping test on Python 3.13") def test_cursor_execute(database_conn): reset_comms() with patch( "aikido_zen.vulnerabilities.run_vulnerability_scan" ) as mock_run_vulnerability_scan: cursor = database_conn.cursor() + print(cursor) query = "SELECT * FROM dogs" cursor.execute(query) @@ -35,6 +73,47 @@ def test_cursor_execute(database_conn): mock_run_vulnerability_scan.assert_called_once() +@pytest.mark.skipif(skip_python_3_13, reason="Skipping test on Python 3.13") +def test_cursor_execute2(database_conn_empty_cursor): + reset_comms() + with patch( + "aikido_zen.vulnerabilities.run_vulnerability_scan" + ) as mock_run_vulnerability_scan: + cursor = database_conn_empty_cursor.cursor() + query = "SELECT * FROM dogs" + cursor.execute(query) + + called_with_args = mock_run_vulnerability_scan.call_args[1]["args"] + assert called_with_args[0] == query + assert called_with_args[1] == "postgres" + mock_run_vulnerability_scan.assert_called_once() + + cursor.fetchall() + database_conn_empty_cursor.close() + mock_run_vulnerability_scan.assert_called_once() + + +@pytest.mark.skipif(skip_python_3_13, reason="Skipping test on Python 3.13") +def test_cursor_execute3(database_conn_immutable_cursor): + reset_comms() + with patch( + "aikido_zen.vulnerabilities.run_vulnerability_scan" + ) as mock_run_vulnerability_scan: + cursor = database_conn_immutable_cursor.cursor() + query = "SELECT * FROM dogs" + cursor.execute(query) + + called_with_args = mock_run_vulnerability_scan.call_args[1]["args"] + assert called_with_args[0] == query + assert called_with_args[1] == "postgres" + mock_run_vulnerability_scan.assert_called_once() + + cursor.fetchall() + database_conn_immutable_cursor.close() + mock_run_vulnerability_scan.assert_called_once() + + +@pytest.mark.skipif(skip_python_3_13, reason="Skipping test on Python 3.13") def test_cursor_execute_parameterized(database_conn): reset_comms() with patch( @@ -47,13 +126,31 @@ def test_cursor_execute_parameterized(database_conn): called_with_args = mock_run_vulnerability_scan.call_args[1]["args"] assert called_with_args[0] == query assert called_with_args[1] == "postgres" - mock_run_vulnerability_scan.assert_called_once() - database_conn.commit() database_conn.close() + + +@pytest.mark.skipif(skip_python_3_13, reason="Skipping test on Python 3.13") +def test_cursor_execute_parameterized2(database_conn_empty_cursor): + reset_comms() + with patch( + "aikido_zen.vulnerabilities.run_vulnerability_scan" + ) as mock_run_vulnerability_scan: + cursor = database_conn_empty_cursor.cursor() + query = "INSERT INTO dogs (dog_name, isadmin) VALUES (%s, %s)" + cursor.execute(query, ("doggo", True)) + + called_with_args = mock_run_vulnerability_scan.call_args[1]["args"] + assert called_with_args[0] == query + assert called_with_args[1] == "postgres" + mock_run_vulnerability_scan.assert_called_once() + + database_conn_empty_cursor.commit() + database_conn_empty_cursor.close() mock_run_vulnerability_scan.assert_called_once() +@pytest.mark.skipif(skip_python_3_13, reason="Skipping test on Python 3.13") def test_cursor_executemany(database_conn): reset_comms() with patch( @@ -72,9 +169,61 @@ def test_cursor_executemany(database_conn): == "INSERT INTO dogs (dog_name, isadmin) VALUES (%s, %s)" ) assert called_with_args[1] == "postgres" - mock_run_vulnerability_scan.assert_called_once() database_conn.commit() cursor.close() database_conn.close() + + +@pytest.mark.skipif(skip_python_3_13, reason="Skipping test on Python 3.13") +def test_cursor_executemany2(database_conn_empty_cursor): + reset_comms() + with patch( + "aikido_zen.vulnerabilities.run_vulnerability_scan" + ) as mock_run_vulnerability_scan: + cursor = database_conn_empty_cursor.cursor() + data = [ + ("Doggy", False), + ("Doggy 2", True), + ("Dogski", True), + ] + cursor.executemany("INSERT INTO dogs (dog_name, isadmin) VALUES (%s, %s)", data) + called_with_args = mock_run_vulnerability_scan.call_args[1]["args"] + assert ( + called_with_args[0] + == "INSERT INTO dogs (dog_name, isadmin) VALUES (%s, %s)" + ) + assert called_with_args[1] == "postgres" + mock_run_vulnerability_scan.assert_called_once() + + database_conn_empty_cursor.commit() + cursor.close() + database_conn_empty_cursor.close() + mock_run_vulnerability_scan.assert_called_once() + + +@pytest.mark.skipif(skip_python_3_13, reason="Skipping test on Python 3.13") +def test_cursor_executemany3(database_conn_immutable_cursor): + reset_comms() + with patch( + "aikido_zen.vulnerabilities.run_vulnerability_scan" + ) as mock_run_vulnerability_scan: + cursor = database_conn_immutable_cursor.cursor() + data = [ + ("Doggy", False), + ("Doggy 2", True), + ("Dogski", True), + ] + cursor.executemany("INSERT INTO dogs (dog_name, isadmin) VALUES (%s, %s)", data) + called_with_args = mock_run_vulnerability_scan.call_args[1]["args"] + assert ( + called_with_args[0] + == "INSERT INTO dogs (dog_name, isadmin) VALUES (%s, %s)" + ) + assert called_with_args[1] == "postgres" + mock_run_vulnerability_scan.assert_called_once() + + database_conn_immutable_cursor.commit() + cursor.close() + database_conn_immutable_cursor.close() mock_run_vulnerability_scan.assert_called_once() diff --git a/aikido_zen/sinks/tests/shutil_test.py b/aikido_zen/sinks/tests/shutil_test.py index adfaf1f6c..a9e3efc40 100644 --- a/aikido_zen/sinks/tests/shutil_test.py +++ b/aikido_zen/sinks/tests/shutil_test.py @@ -28,7 +28,7 @@ def test_shutil_copyfile(): assert call_2.kwargs["args"] == args2 -def test_shutil_copyfile(): +def test_shutil_copyfile_2(): with patch( "aikido_zen.vulnerabilities.run_vulnerability_scan" ) as mock_run_vulnerability_scan: @@ -135,7 +135,6 @@ def test_shutil_copy(): op = "builtins.open" args1 = ("Makefile",) args2 = ("test2",) - assert len(mock_run_vulnerability_scan.call_args_list) == 3 call_1 = mock_run_vulnerability_scan.call_args_list[0] call_2 = mock_run_vulnerability_scan.call_args_list[1] @@ -155,7 +154,6 @@ def test_shutil_copy2(): op = "builtins.open" args1 = ("Makefile",) args2 = ("test2",) - assert len(mock_run_vulnerability_scan.call_args_list) == 3 call_1 = mock_run_vulnerability_scan.call_args_list[0] call_2 = mock_run_vulnerability_scan.call_args_list[1] diff --git a/aikido_zen/sinks/tests/subprocess_test.py b/aikido_zen/sinks/tests/subprocess_test.py index a155725b1..8a8bb4735 100644 --- a/aikido_zen/sinks/tests/subprocess_test.py +++ b/aikido_zen/sinks/tests/subprocess_test.py @@ -171,34 +171,34 @@ def test_subprocess_check_output(): ) as mock_run_vulnerability_scan: import subprocess - op = "subprocess.check_output" + op = "subprocess.Popen" subprocess.check_output(["ls", "-la"], shell=True) args = ("ls -la",) - mock_run_vulnerability_scan.assert_called_with(kind=kind, op=op, args=args) + mock_run_vulnerability_scan.assert_any_call(kind=kind, op=op, args=args) with pytest.raises(subprocess.CalledProcessError): subprocess.check_output(["cfsknflks"], shell=True) args = ("cfsknflks",) - mock_run_vulnerability_scan.assert_called_with(kind=kind, op=op, args=args) + mock_run_vulnerability_scan.assert_any_call(kind=kind, op=op, args=args) with pytest.raises(subprocess.CalledProcessError): subprocess.check_output(("tuple", "command"), shell=True) args = ("tuple command",) - mock_run_vulnerability_scan.assert_called_with(kind=kind, op=op, args=args) + mock_run_vulnerability_scan.assert_any_call(kind=kind, op=op, args=args) with pytest.raises(subprocess.CalledProcessError): subprocess.check_output({"key": "value"}, shell=True) args = ("key",) - mock_run_vulnerability_scan.assert_called_with(kind=kind, op=op, args=args) + mock_run_vulnerability_scan.assert_any_call(kind=kind, op=op, args=args) with pytest.raises(subprocess.CalledProcessError): subprocess.check_output({"ke": "value", "key2": "value2"}, shell=True) args = ("ke key2",) - mock_run_vulnerability_scan.assert_called_with(kind=kind, op=op, args=args) + mock_run_vulnerability_scan.assert_any_call(kind=kind, op=op, args=args) -def test_subprocess_check_output(): +def test_subprocess_check_output_2(): with patch( "aikido_zen.vulnerabilities.run_vulnerability_scan" ) as mock_run_vulnerability_scan: diff --git a/aikido_zen/sources/django/__init__.py b/aikido_zen/sources/django/__init__.py index 9c16ed579..91c92d29d 100644 --- a/aikido_zen/sources/django/__init__.py +++ b/aikido_zen/sources/django/__init__.py @@ -1,42 +1,36 @@ """`Django` source module""" -import copy -import aikido_zen.importhook as importhook -from aikido_zen.helpers.logging import logger -from aikido_zen.background_process.packages import is_package_compatible, ANY_VERSION from ..functions.request_handler import request_handler from .run_init_stage import run_init_stage from .pre_response_middleware import pre_response_middleware +from ...helpers.get_argument import get_argument +from ...sinks import on_import, patch_function, before, after -@importhook.on_import("django.core.handlers.base") -def on_django_gunicorn_import(django): - """ - Hook 'n wrap on `django.core.handlers.base` - Our goal is to wrap the `_get_response` function - # https://github.com/django/django/blob/5865ff5adcf64da03d306dc32b36e87ae6927c85/django/core/handlers/base.py#L174 - Returns : Modified django.core.handlers.base object - """ - if not is_package_compatible("django", required_version=ANY_VERSION): - return django - modified_django = importhook.copy_module(django) +@before +def _get_response_before(func, instance, args, kwargs): + request = get_argument(args, kwargs, 0, "request") - former__get_response = copy.deepcopy(django.BaseHandler._get_response) + run_init_stage(request) - def aikido__get_response(self, request): # Synchronous (WSGI) - run_init_stage(request) # We do some initial request handling + if pre_response_middleware not in instance._view_middleware: + # The rate limiting middleware needs to be last in the chain. + instance._view_middleware += [pre_response_middleware] - if pre_response_middleware not in self._view_middleware: - # The rate limiting middleware needs to be last in the chain. - self._view_middleware += [pre_response_middleware] - res = former__get_response(self, request) - if hasattr(res, "status_code"): - request_handler(stage="post_response", status_code=res.status_code) - return res +@after +def _get_response_after(func, instance, args, kwargs, return_value): + if hasattr(return_value, "status_code"): + request_handler(stage="post_response", status_code=return_value.status_code) - # pylint: disable=no-member - setattr(modified_django.BaseHandler, "_get_response", aikido__get_response) - setattr(django.BaseHandler, "_get_response", aikido__get_response) - return modified_django +@on_import("django.core.handlers.base", "django") +def patch(m): + """ + Patch for _get_response (Synchronous/WSGI) + - before: Parse body, create context & add middleware to run before a response + - after: Check respone code to see if route should be analyzed + # https://github.com/django/django/blob/5865ff5adcf64da03d306dc32b36e87ae6927c85/django/core/handlers/base.py#L174 + """ + patch_function(m, "BaseHandler._get_response", _get_response_before) + patch_function(m, "BaseHandler._get_response", _get_response_after) diff --git a/aikido_zen/sources/flask.py b/aikido_zen/sources/flask.py index 6fc862749..e29994ca5 100644 --- a/aikido_zen/sources/flask.py +++ b/aikido_zen/sources/flask.py @@ -1,46 +1,39 @@ -""" -Flask source module, intercepts flask import and adds Aikido middleware -""" - -import copy -import aikido_zen.importhook as importhook +from aikido_zen.helpers.get_argument import get_argument from aikido_zen.helpers.logging import logger from aikido_zen.context import Context -from aikido_zen.background_process.packages import is_package_compatible, ANY_VERSION from aikido_zen.context import get_current_context import aikido_zen.sources.functions.request_handler as funcs +from aikido_zen.sinks import ( + on_import, + patch_function, + after, + before_modify_return, + before, +) -def aik_full_dispatch_request(*args, former_full_dispatch_request=None, **kwargs): - """ - Creates a new full_dispatch_request function : - https://github.com/pallets/flask/blob/2fec0b206c6e83ea813ab26597e15c96fab08be7/src/flask/app.py#L884 - This function gets called in the wsgi_app. So this function onlygets called after all the - middleware. This is important since we want to be able to access users. This also means the - request in request_ctx is available and we can extract data from it This function also - returns a response, so we can send status codes and error messages. - """ - # pylint:disable=import-outside-toplevel # We don't want to install this by default - try: - from flask.globals import request_ctx - from flask import Response - except ImportError: - logger.info("Flask not properly installed.") - return former_full_dispatch_request(*args, **kwargs) +@before_modify_return +def _full_dispatch_request_before(func, instance, args, kwargs): + from flask.globals import request_ctx + from flask import Response req = request_ctx.request - extract_cookies_from_flask_request_and_save_data(req) extract_form_data_from_flask_request_and_save_data(req) extract_view_args_from_flask_request_and_save_data(req) pre_response = funcs.request_handler(stage="pre_response") - if pre_response: - # This happens when a route is rate limited, a user blocked, etc... - return Response(pre_response[0], status=pre_response[1], mimetype="text/plain") - res = former_full_dispatch_request(*args, **kwargs) - funcs.request_handler(stage="post_response", status_code=res.status_code) - return res + if not pre_response: + return None + # This happens when a route is rate limited, a user blocked, etc... + return Response(pre_response[0], status=pre_response[1], mimetype="text/plain") + + +@after +def _full_dispatch_request_after(func, instance, args, kwargs, return_value): + if not hasattr(return_value, "status_code"): + return + funcs.request_handler(stage="post_response", status_code=return_value.status_code) def extract_view_args_from_flask_request_and_save_data(req): @@ -79,41 +72,25 @@ def extract_cookies_from_flask_request_and_save_data(req): logger.debug("Exception occurred whilst extracting flask cookie data: %s", e) -def aikido___call__(flask_app, environ, start_response): - """Aikido's __call__ wrapper""" - # We don't want to install werkzeug : - # pylint: disable=import-outside-toplevel - try: - context1 = Context(req=environ, source="flask") - context1.set_as_current_context() - funcs.request_handler(stage="init") - except Exception as e: - logger.debug("Exception on aikido __call__ function : %s", e) - res = flask_app.wsgi_app(environ, start_response) - return res - - -FLASK_REQUIRED_VERSION = "2.3.0" +@before +def _call(func, instance, args, kwargs): + environ = get_argument(args, kwargs, 0, "environ") + context1 = Context(req=environ, source="flask") + context1.set_as_current_context() + funcs.request_handler(stage="init") -@importhook.on_import("flask.app") -def on_flask_import(flask): +@on_import("flask.app", "flask", version_requirement="2.2.4") +def patch(m): """ - Hook 'n wrap on `flask.app`. Flask class |-> App class |-> Scaffold class - @app.route |-> `add_url_rule` |-> self.view_functions. these get called via - full_dispatch_request, which we wrap. We also wrap __call__ to run our middleware. + patching module flask.appimport + + - patches: Flask.__call__ (context parsing/initial stage) + - patches: Flask.full_dispatch_request + **Why?** full_dispatch_request gets called in the WSGI app. It gets called after all middleware. request_ctx is + available, so we can extract data from it. It returns a response, so we can send status codes and error messages. + (github src: https://github.com/pallets/flask/blob/bc143499cf1137a271a7cf75bdd3e16e43ede2f0/src/flask/app.py#L1529) """ - if not is_package_compatible("flask", required_version=FLASK_REQUIRED_VERSION): - return flask - modified_flask = importhook.copy_module(flask) - former_fdr = copy.deepcopy(flask.Flask.full_dispatch_request) - - def aikido_wrapper_fdr(*args, **kwargs): - return aik_full_dispatch_request( - *args, former_full_dispatch_request=former_fdr, **kwargs - ) - - # pylint:disable=no-member # Pylint has issues with the wrapping - setattr(modified_flask.Flask, "__call__", aikido___call__) - setattr(modified_flask.Flask, "full_dispatch_request", aikido_wrapper_fdr) - return modified_flask + patch_function(m, "Flask.__call__", _call) + patch_function(m, "Flask.full_dispatch_request", _full_dispatch_request_before) + patch_function(m, "Flask.full_dispatch_request", _full_dispatch_request_after) diff --git a/aikido_zen/sources/gunicorn.py b/aikido_zen/sources/gunicorn.py deleted file mode 100644 index caa704e80..000000000 --- a/aikido_zen/sources/gunicorn.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Gunicorn Module, report if module was found""" - -import aikido_zen.importhook as importhook -from aikido_zen.background_process.packages import is_package_compatible, ANY_VERSION - - -@importhook.on_import("gunicorn") -def on_gunicorn_import(gunicorn): - """Report to the core when gunicorn gets imported""" - is_package_compatible("gunicorn", required_version=ANY_VERSION) - return gunicorn diff --git a/aikido_zen/sources/quart.py b/aikido_zen/sources/quart.py index a2057362f..9e0fa6f63 100644 --- a/aikido_zen/sources/quart.py +++ b/aikido_zen/sources/quart.py @@ -1,70 +1,71 @@ -""" -Quart source module, intercepts quart import and adds Aikido middleware -""" - -import copy -import aikido_zen.importhook as importhook -from aikido_zen.helpers.logging import logger from aikido_zen.context import Context, get_current_context -from aikido_zen.background_process.packages import is_package_compatible, ANY_VERSION from .functions.request_handler import request_handler +from ..helpers.get_argument import get_argument +from ..sinks import on_import, patch_function, before, before_async -async def aikido___call___wrapper(former_call, quart_app, scope, receive, send): - """Aikido's __call__ wrapper""" - # We don't want to install werkzeug : - # pylint: disable=import-outside-toplevel - try: - if scope["type"] != "http": - return await former_call(quart_app, scope, receive, send) - context1 = Context(req=scope, source="quart") - context1.set_as_current_context() +@before +def _call(func, instance, args, kwargs): + scope = get_argument(args, kwargs, 0, "scope") + if not scope or scope.get("type") != "http": + return - request_handler(stage="init") - except Exception as e: - logger.debug("Exception on aikido __call__ function : %s", e) - return await former_call(quart_app, scope, receive, send) + new_context = Context(req=scope, source="quart") + new_context.set_as_current_context() + request_handler(stage="init") -async def handle_request_wrapper(former_handle_request, quart_app, req): - """ - https://github.com/pallets/quart/blob/2fc6d4fa6e3df017e8eef1411ec80b5a6dce25a5/src/quart/app.py#L1400 - Wraps the handle_request function - """ - # At this stage no middleware is called yet, running pre_response is - # not what we need to do now, but we can store the body inside context : - try: - context = get_current_context() - if context: - form = await req.form - if req.is_json: - context.set_body(await req.get_json()) - elif form: - context.set_body(form) - else: - data = await req.data - context.set_body(data.decode("utf-8")) - context.cookies = req.cookies.to_dict() - context.set_as_current_context() - except Exception as e: - logger.debug("Exception in handle_request : %s", e) - - # Fetch response and run post_response handler : +@before_async +async def _handle_request_before(func, instance, args, kwargs): + context = get_current_context() + if not context: + return + + request = get_argument(args, kwargs, 0, "request") + if not request: + return + + form = await request.form + if request.is_json: + context.set_body(await request.get_json()) + elif form: + context.set_body(form) + else: + data = await request.data + context.set_body(data.decode("utf-8")) + context.cookies = request.cookies.to_dict() + context.set_as_current_context() + + +async def _handle_request_after(func, instance, args, kwargs): # pylint:disable=import-outside-toplevel # We don't want to install this by default from werkzeug.exceptions import HTTPException try: - response = await former_handle_request(quart_app, req) - status_code = response.status_code - request_handler(stage="post_response", status_code=status_code) + response = await func(*args, **kwargs) + if hasattr(response, "status_code"): + request_handler(stage="post_response", status_code=response.status_code) return response except HTTPException as e: request_handler(stage="post_response", status_code=e.code) raise e +async def _asgi_app(func, instance, args, kwargs): + scope = get_argument(args, kwargs, 0, "scope") + if not scope or scope.get("type") != "http": + return await func(*args, **kwargs) + send = get_argument(args, kwargs, 2, "send") + if not send: + return await func(*args, **kwargs) + + pre_response = request_handler(stage="pre_response") + if pre_response: + return await send_status_code_and_text(send, pre_response) + return await func(*args, **kwargs) + + async def send_status_code_and_text(send, pre_response): - """Sends a status code and text""" await send( { "type": "http.response.start", @@ -81,38 +82,15 @@ async def send_status_code_and_text(send, pre_response): ) -@importhook.on_import("quart.app") -def on_quart_import(quart): +@on_import("quart.app", "quart") +def patch(m): """ - Hook 'n wrap on `quart.app` - Our goal is to wrap the __call__, handle_request, asgi_app functios of the "Quart" class + patching module quart.app + - patches Quart.__call__ (creates Context) + - patches Quart.handle_request (Stores body/cookies, checks status code) + - patches Quart.asgi_app (Pre-response: puts in messages when request is blocked) """ - if not is_package_compatible("quart", required_version=ANY_VERSION): - return quart - modified_quart = importhook.copy_module(quart) - - former_handle_request = copy.deepcopy(quart.Quart.handle_request) - former_asgi_app = copy.deepcopy(quart.Quart.asgi_app) - former_call = copy.deepcopy(quart.Quart.__call__) - - async def aikido___call__(quart_app, scope, receive=None, send=None): - return await aikido___call___wrapper( - former_call, quart_app, scope, receive, send - ) - - async def aikido_handle_request(quart_app, request): - return await handle_request_wrapper(former_handle_request, quart_app, request) - - async def aikido_asgi_app(quart_app, scope, receive=None, send=None): - if scope["type"] == "http": - # Run pre_response code : - pre_response = request_handler(stage="pre_response") - if pre_response: - return await send_status_code_and_text(send, pre_response) - return await former_asgi_app(quart_app, scope, receive, send) - - # pylint:disable=no-member # Pylint has issues with the wrapping - setattr(modified_quart.Quart, "__call__", aikido___call__) - setattr(modified_quart.Quart, "handle_request", aikido_handle_request) - setattr(modified_quart.Quart, "asgi_app", aikido_asgi_app) - return modified_quart + patch_function(m, "Quart.__call__", _call) + patch_function(m, "Quart.handle_request", _handle_request_before) + patch_function(m, "Quart.handle_request", _handle_request_after) + patch_function(m, "Quart.asgi_app", _asgi_app) diff --git a/aikido_zen/sources/starlette/__init__.py b/aikido_zen/sources/starlette/__init__.py index e22cb1891..43ca74234 100644 --- a/aikido_zen/sources/starlette/__init__.py +++ b/aikido_zen/sources/starlette/__init__.py @@ -1,6 +1,4 @@ """ -Init.py file for starlette module ---- Starlette wrapping is subdivided in two parts : - starlette.applications : Wraps __call__ on Starlette class to run "init" stage. - starlette.routing : request_response function : Run pre_response code and @@ -11,18 +9,5 @@ e.g. body, json, form. This also saves it inside the current context. """ -import aikido_zen.importhook as importhook -from aikido_zen.background_process.packages import is_package_compatible, ANY_VERSION - - -@importhook.on_import("starlette") -def on_starlette_import(starlette): - """ - This checks for the package version of starlette so you don't have to do it twice, - once in starlette_applications and once in starlette_applications. - """ - if not is_package_compatible("starlette", required_version=ANY_VERSION): - return starlette - # Package is compatible, start wrapping : - import aikido_zen.sources.starlette.starlette_applications - import aikido_zen.sources.starlette.starlette_routing +import aikido_zen.sources.starlette.starlette_applications +import aikido_zen.sources.starlette.starlette_routing diff --git a/aikido_zen/sources/starlette/starlette_applications.py b/aikido_zen/sources/starlette/starlette_applications.py index ce5ca8f66..36d02899e 100644 --- a/aikido_zen/sources/starlette/starlette_applications.py +++ b/aikido_zen/sources/starlette/starlette_applications.py @@ -1,36 +1,26 @@ """Wraps starlette.applications for initial request_handler""" -import copy -import aikido_zen.importhook as importhook -from aikido_zen.helpers.logging import logger from aikido_zen.context import Context from ..functions.request_handler import request_handler +from ...helpers.get_argument import get_argument +from ...sinks import on_import, patch_function, before -@importhook.on_import("starlette.applications") -def on_starlette_import(starlette): - """ - Hook 'n wrap on `starlette.applications` - Our goal is to wrap the __call__ function of the Starlette class - """ - modified_starlette = importhook.copy_module(starlette) - former_call = copy.deepcopy(starlette.Starlette.__call__) - - async def aikido___call__(app, scope, receive=None, send=None): - return await aik_call_wrapper(former_call, app, scope, receive, send) +@before +def _call(func, instance, args, kwargs): + scope = get_argument(args, kwargs, 0, "scope") + if not hasattr(scope, "get") or scope.get("type") != "http": + return - setattr(modified_starlette.Starlette, "__call__", aikido___call__) - return modified_starlette + new_context = Context(req=scope, source="starlette") + new_context.set_as_current_context() + request_handler(stage="init") -async def aik_call_wrapper(former_call, app, scope, receive, send): - """Aikido's __call__ wrapper""" - try: - if scope["type"] != "http": - return await former_call(app, scope, receive, send) - context1 = Context(req=scope, source="starlette") - context1.set_as_current_context() - request_handler(stage="init") - except Exception as e: - logger.debug("Exception on aikido __call__ function : %s", e) - return await former_call(app, scope, receive, send) +@on_import("starlette.applications", "starlette") +def patch(m): + """ + patching module starlette.applications + - patches: Starlette.__call__ + """ + patch_function(m, "Starlette.__call__", _call) diff --git a/aikido_zen/sources/starlette/starlette_routing.py b/aikido_zen/sources/starlette/starlette_routing.py index d65dc63e0..d38f3d4b7 100644 --- a/aikido_zen/sources/starlette/starlette_routing.py +++ b/aikido_zen/sources/starlette/starlette_routing.py @@ -1,37 +1,30 @@ -""" -Wraps starlette.applications for initial request_handler -Attention: We will be using rr to refer to request_response. It's used a lot and -readability would be impaired if we did not abbreviate this -""" - -import copy -import aikido_zen.importhook as importhook from aikido_zen.helpers.logging import logger from .extract_data_from_request import extract_data_from_request from ..functions.request_handler import request_handler +from ...sinks import on_import, patch_function, before -@importhook.on_import("starlette.routing") -def on_starlette_import(routing): - """ - Hook 'n wrap on `starlette.routing` - Wraps the request_response function so we can wrap the function given to request_response - """ - modified_routing = importhook.copy_module(routing) - former_rr_func = copy.deepcopy(routing.request_response) +def _request_response(func, instance, args, kwargs): + if kwargs and "func" in kwargs: + kwargs["func"] = aik_route_func_wrapper(kwargs["func"]) + elif args and args[0]: + # Modify first element of a tuple, tuples are immutable + args = (aik_route_func_wrapper(args[0]),) + args[1:] - def aikido_rr_func(func): - wrapped_route_func = aik_route_func_wrapper(func) - return former_rr_func(wrapped_route_func) + return func(*args, **kwargs) # Call the original function - setattr(routing, "request_response", aikido_rr_func) - setattr(modified_routing, "request_response", aikido_rr_func) - return modified_routing +@on_import("starlette.routing", "starlette") +def patch(m): + """ + patching module starlette.routing (for initial request_handler) + - patches: request_response + (github src: https://github.com/encode/starlette/blob/4acf1d1ca3e8aa767567cb4e6e12f093f066553b/starlette/routing.py#L58) + """ + patch_function(m, "request_response", _request_response) -def aik_route_func_wrapper(func): - """Aikido's __call__ wrapper""" +def aik_route_func_wrapper(func): async def aikido_route_func(*args, **kwargs): # Code before response (pre_response stage) try: diff --git a/aikido_zen/sources/uwsgi.py b/aikido_zen/sources/uwsgi.py deleted file mode 100644 index f2a61f4ee..000000000 --- a/aikido_zen/sources/uwsgi.py +++ /dev/null @@ -1,11 +0,0 @@ -"""UWSGI Module, report if module was found""" - -import aikido_zen.importhook as importhook -from aikido_zen.background_process.packages import is_package_compatible, ANY_VERSION - - -@importhook.on_import("uwsgi") -def on_uwsgi_import(uwsgi): - """Report to the core when uwsgi gets imported""" - is_package_compatible("uwsgi", required_version=ANY_VERSION) - return uwsgi diff --git a/aikido_zen/sources/xml_sources/lxml.py b/aikido_zen/sources/xml_sources/lxml.py index 0519ce7da..4558959cc 100644 --- a/aikido_zen/sources/xml_sources/lxml.py +++ b/aikido_zen/sources/xml_sources/lxml.py @@ -1,47 +1,31 @@ -""" -Sink module for `xml`, python's built-in function -""" - -import copy -import aikido_zen.importhook as importhook from aikido_zen.helpers.extract_data_from_xml_body import ( extract_data_from_xml_body, ) -from aikido_zen.background_process.packages import is_package_compatible, ANY_VERSION - +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import on_import, after, patch_function -@importhook.on_import("lxml.etree") -def on_lxml_import(eltree): - """ - Hook 'n wrap on `lxml.etree`. - - Wrap on fromstring() function - - Wrap on - Returns : Modified `lxml.etree` object - """ - if not is_package_compatible("lxml", required_version=ANY_VERSION): - return eltree - modified_eltree = importhook.copy_module(eltree) - former_fromstring = copy.deepcopy(eltree.fromstring) +@after +def _fromstring(func, instance, args, kwargs, return_value): + text = get_argument(args, kwargs, 0, "text") + if text: + extract_data_from_xml_body(user_input=text, root_element=return_value) - def aikido_fromstring(text, *args, **kwargs): - res = former_fromstring(text, *args, **kwargs) - extract_data_from_xml_body(user_input=text, root_element=res) - return res - former_fromstringlist = copy.deepcopy(eltree.fromstringlist) +@after +def _fromstringlist(func, instance, args, kwargs, return_value): + strings = get_argument(args, kwargs, 0, "strings") + for text in strings: + extract_data_from_xml_body(user_input=text, root_element=return_value) - def aikido_fromstringlist(strings, *args, **kwargs): - res = former_fromstringlist(strings, *args, **kwargs) - for string in strings: - extract_data_from_xml_body(user_input=string, root_element=res) - return res - # pylint: disable=no-member - setattr(eltree, "fromstring", aikido_fromstring) - setattr(modified_eltree, "fromstring", aikido_fromstring) - - # pylint: disable=no-member - setattr(eltree, "fromstringlist", aikido_fromstringlist) - setattr(modified_eltree, "fromstringlist", aikido_fromstringlist) - return modified_eltree +@on_import("lxml.etree", "lxml") +def patch(m): + """ + patching module lxml.etree + - patches function fromstring(text, ...) + - patches function fromstringlist(strings, ...) + (github src: https://github.com/lxml/lxml/blob/fe271a4b5a32e6e54d10983683f2f32b0647209a/src/lxml/etree.pyx#L3411) + """ + patch_function(m, "fromstring", _fromstring) + patch_function(m, "fromstringlist", _fromstringlist) diff --git a/aikido_zen/sources/xml_sources/xml.py b/aikido_zen/sources/xml_sources/xml.py index 2062f04e2..6f26d5ec9 100644 --- a/aikido_zen/sources/xml_sources/xml.py +++ b/aikido_zen/sources/xml_sources/xml.py @@ -1,51 +1,30 @@ -""" -Sink module for `xml`, python's built-in function -""" - -import copy -import aikido_zen.importhook as importhook -from aikido_zen.helpers.logging import logger from aikido_zen.helpers.extract_data_from_xml_body import ( extract_data_from_xml_body, ) +from aikido_zen.helpers.get_argument import get_argument +from aikido_zen.sinks import on_import, patch_function, after -@importhook.on_import("xml.etree.ElementTree") -def on_xml_import(eltree): - """ - Hook 'n wrap on `xml.etree.ElementTree`, python's built-in xml lib - Our goal is to create a new and mutable aikido parser class - Returns : Modified ElementTree object - """ - modified_eltree = importhook.copy_module(eltree) - copy_xml_parser = copy.deepcopy(eltree.XMLParser) - - class MutableAikidoXMLParser: - """Mutable connection class used to instrument `xml` by Zen""" - - def __init__(self, *args, **kwargs): - self._former_xml_parser = copy_xml_parser(*args, **kwargs) - self._feed_func_copy = copy.deepcopy(self._former_xml_parser.feed) +@after +def _fromstring(func, instance, args, kwargs, return_value): + text = get_argument(args, kwargs, 0, "text") + extract_data_from_xml_body(user_input=text, root_element=return_value) - def __getattr__(self, name): - if name != "feed": - return getattr(self._former_xml_parser, name) - # Return aa function dynamically - def feed(data): - former_feed_result = self._feed_func_copy(data) +@after +def _fromstringlist(func, instance, args, kwargs, return_value): + strings = get_argument(args, kwargs, 0, "sequence") + for text in strings: + extract_data_from_xml_body(user_input=text, root_element=return_value) - # Fetch the data, this should just return an internal attribute - # and not close a stream or something that is noticable by the end-user - parsed_xml = self.target.close() - extract_data_from_xml_body(user_input=data, root_element=parsed_xml) - return former_feed_result - - return feed - - # pylint: disable=no-member - setattr(eltree, "XMLParser", MutableAikidoXMLParser) - setattr(modified_eltree, "XMLParser", MutableAikidoXMLParser) - - return modified_eltree +@on_import("xml.etree.ElementTree") +def patch(m): + """ + patching module xml.etree.ElementTree + - patches function fromstring(text, ...) + - patches function fromstringlist(sequence, ...) + (src: https://github.com/python/cpython/blob/bc1a6ecfab02075acea79f8460a2dce70c61b2fd/Lib/xml/etree/ElementTree.py#L1370) + """ + patch_function(m, "fromstring", _fromstring) + patch_function(m, "fromstringlist", _fromstringlist) diff --git a/benchmarks/starlette_benchmark.py b/benchmarks/starlette_benchmark.py index c6144712f..6e4dc77f1 100644 --- a/benchmarks/starlette_benchmark.py +++ b/benchmarks/starlette_benchmark.py @@ -5,7 +5,7 @@ def generate_wrk_command_for_url(url): # Define the command with awk included - return "wrk -t12 -c400 -d15s " + url + return "wrk -t5 -c200 -d15s " + url def extract_requests_and_latency_tuple(output): if output.returncode == 0: @@ -22,7 +22,7 @@ def extract_requests_and_latency_tuple(output): print(output.stderr.strip()) sys.exit(1) -def run_benchmark(route1, route2, descriptor, percentage_limit, ms_limit): +def run_benchmark(route1, route2, descriptor, percentage_limit): output_nofw = subprocess.run( generate_wrk_command_for_url(route2), @@ -51,8 +51,6 @@ def run_benchmark(route1, route2, descriptor, percentage_limit, ms_limit): delta_in_ms = round(result_fw[1] - result_nofw[1], 2) print(f"-> Delta in ms: {delta_in_ms}ms after running load test on {descriptor}") - if delta_in_ms > ms_limit: - sys.exit(1) delay_percentage = round( (result_nofw[0] - result_fw[0]) / result_nofw[0] * 100 ) @@ -67,9 +65,9 @@ def run_benchmark(route1, route2, descriptor, percentage_limit, ms_limit): "http://localhost:8102/delayed_route", "http://localhost:8103/delayed_route", "a non empty route which makes a simulated request to a database", - percentage_limit=15, ms_limit=20 + percentage_limit=15 ) run_benchmark( "http://localhost:8102/just", "http://localhost:8103/just", "an empty route", - percentage_limit=30, ms_limit=25 + percentage_limit=30 ) diff --git a/poetry.lock b/poetry.lock index bdc3889a6..889b98a2d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1619,6 +1619,95 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [[package]] name = "zipp" version = "3.20.1" @@ -1643,4 +1732,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.8" -content-hash = "9c16523b9caefcd6ec2fb78dc8dc12245f3b956d9c0b3cc6d0bd1eeecaaa8366" +content-hash = "c45d2e37a4d793aaac77698245343037fa87acc3c43e321ca1c9505b55fab741" diff --git a/pyproject.toml b/pyproject.toml index e39cfa73c..e4149b812 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,7 @@ python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" packaging = "^24.1" +wrapt = "^1.17.2" [tool.poetry.group.dev.dependencies] black = "^24.4.2" diff --git a/sample-apps/django-mysql-gunicorn/poetry.lock b/sample-apps/django-mysql-gunicorn/poetry.lock index c24fd2b34..7ba878135 100644 --- a/sample-apps/django-mysql-gunicorn/poetry.lock +++ b/sample-apps/django-mysql-gunicorn/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" diff --git a/sample-apps/django-mysql/poetry.lock b/sample-apps/django-mysql/poetry.lock index 0f50f429a..9b4620419 100644 --- a/sample-apps/django-mysql/poetry.lock +++ b/sample-apps/django-mysql/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -575,6 +576,95 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0" diff --git a/sample-apps/django-postgres-gunicorn/poetry.lock b/sample-apps/django-postgres-gunicorn/poetry.lock index 9bf1b0fdd..3b52b9743 100644 --- a/sample-apps/django-postgres-gunicorn/poetry.lock +++ b/sample-apps/django-postgres-gunicorn/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" diff --git a/sample-apps/fastapi-postgres-uvicorn/poetry.lock b/sample-apps/fastapi-postgres-uvicorn/poetry.lock index 836da824c..3e69ce6c6 100644 --- a/sample-apps/fastapi-postgres-uvicorn/poetry.lock +++ b/sample-apps/fastapi-postgres-uvicorn/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -954,6 +955,95 @@ typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [metadata] lock-version = "2.1" python-versions = ">3.9.1,<4.0" diff --git a/sample-apps/flask-mongo/poetry.lock b/sample-apps/flask-mongo/poetry.lock index 8f4ed85e0..16e95a245 100644 --- a/sample-apps/flask-mongo/poetry.lock +++ b/sample-apps/flask-mongo/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" diff --git a/sample-apps/flask-mssql/poetry.lock b/sample-apps/flask-mssql/poetry.lock index 7b19a0ce6..939c2e223 100644 --- a/sample-apps/flask-mssql/poetry.lock +++ b/sample-apps/flask-mssql/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -740,6 +741,95 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [[package]] name = "zipp" version = "3.21.0" diff --git a/sample-apps/flask-mysql-uwsgi/poetry.lock b/sample-apps/flask-mysql-uwsgi/poetry.lock index 98b42bf28..4b9331681 100644 --- a/sample-apps/flask-mysql-uwsgi/poetry.lock +++ b/sample-apps/flask-mysql-uwsgi/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -715,6 +716,95 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [[package]] name = "zipp" version = "3.21.0" diff --git a/sample-apps/flask-mysql/poetry.lock b/sample-apps/flask-mysql/poetry.lock index 56963fa8b..1de267b54 100644 --- a/sample-apps/flask-mysql/poetry.lock +++ b/sample-apps/flask-mysql/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -760,6 +761,95 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [[package]] name = "zipp" version = "3.21.0" diff --git a/sample-apps/flask-postgres-xml/poetry.lock b/sample-apps/flask-postgres-xml/poetry.lock index 1e3dcf5a9..c5dbc21fd 100644 --- a/sample-apps/flask-postgres-xml/poetry.lock +++ b/sample-apps/flask-postgres-xml/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -905,6 +906,95 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [[package]] name = "zipp" version = "3.21.0" diff --git a/sample-apps/flask-postgres/poetry.lock b/sample-apps/flask-postgres/poetry.lock index 73d25f246..8f1089bc2 100644 --- a/sample-apps/flask-postgres/poetry.lock +++ b/sample-apps/flask-postgres/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,23 +15,12 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17.2" [package.source] type = "directory" url = "../.." -[[package]] -name = "blinker" -version = "1.9.0" -description = "Fast, simple object-to-object and broadcast signaling" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, - {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, -] - [[package]] name = "certifi" version = "2024.12.14" @@ -307,23 +296,22 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "flask" -version = "3.1.0" +version = "2.2.4" description = "A simple framework for building complex web applications." optional = false -python-versions = ">=3.9" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136"}, - {file = "flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac"}, + {file = "Flask-2.2.4-py3-none-any.whl", hash = "sha256:13f6329ddbfff11340939cd11919daf150a01358ded4b7e81c03c055dfecb559"}, + {file = "Flask-2.2.4.tar.gz", hash = "sha256:77504c4c097f56ac5f29b00f9009213010cf9d2923a288c0e0564a5db2bb53d6"}, ] [package.dependencies] -blinker = ">=1.9" -click = ">=8.1.3" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} -itsdangerous = ">=2.2" -Jinja2 = ">=3.1.2" -Werkzeug = ">=3.1" +click = ">=8.0" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.0" +Jinja2 = ">=3.0" +Werkzeug = ">=2.2.2" [package.extras] async = ["asgiref (>=3.2)"] @@ -537,7 +525,6 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, - {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -750,6 +737,95 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [[package]] name = "zipp" version = "3.21.0" @@ -774,4 +850,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">3.9.1,<4.0" -content-hash = "0b02413b2f92eb1c23aab095e47f7086bda4bab47c7fdcedadb0deb534b9e225" +content-hash = "f4728967a2a28ad5c212e67f6bf39cbb1c39c9af9ebec86c59a9536620e2cf39" diff --git a/sample-apps/flask-postgres/pyproject.toml b/sample-apps/flask-postgres/pyproject.toml index 9bc2d0581..931c393a5 100644 --- a/sample-apps/flask-postgres/pyproject.toml +++ b/sample-apps/flask-postgres/pyproject.toml @@ -5,7 +5,7 @@ description = "" readme = "README.md" requires-python = ">3.9.1,<4.0" dependencies = [ - "flask (>=3.1.0,<4.0.0)", + "flask (==2.2.4)", "psycopg2-binary (>=2.9.10,<3.0.0)", "cryptography (>=44.0.0,<45.0.0)", "aikido_zen" diff --git a/sample-apps/quart-mongo/poetry.lock b/sample-apps/quart-mongo/poetry.lock index a06fa4ccb..3ca1c0a21 100644 --- a/sample-apps/quart-mongo/poetry.lock +++ b/sample-apps/quart-mongo/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -993,6 +994,95 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [[package]] name = "wsproto" version = "1.2.0" diff --git a/sample-apps/quart-postgres-uvicorn/poetry.lock b/sample-apps/quart-postgres-uvicorn/poetry.lock index 6781095de..2bb4fefe7 100644 --- a/sample-apps/quart-postgres-uvicorn/poetry.lock +++ b/sample-apps/quart-postgres-uvicorn/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -965,6 +966,95 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [[package]] name = "wsproto" version = "1.2.0" diff --git a/sample-apps/starlette-postgres-uvicorn/poetry.lock b/sample-apps/starlette-postgres-uvicorn/poetry.lock index 7a01f4883..479a6e7ba 100644 --- a/sample-apps/starlette-postgres-uvicorn/poetry.lock +++ b/sample-apps/starlette-postgres-uvicorn/poetry.lock @@ -2,7 +2,7 @@ [[package]] name = "aikido-zen" -version = "1.1.1" +version = "1.0.0" description = "Aikido Zen for Python" optional = false python-versions = "^3.8" @@ -15,6 +15,7 @@ packaging = "^24.1" python-dotenv = "^1.0.1" regex = "^2024.5.15" requests = "^2.32.3" +wrapt = "^1.17" [package.source] type = "directory" @@ -787,6 +788,95 @@ typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0"