Python: CG trace: Add support for flask

This commit is contained in:
Rasmus Wriedt Larsen
2020-07-24 20:06:53 +02:00
parent bb80635dc3
commit aca703e131
2 changed files with 28 additions and 6 deletions

View File

@@ -14,5 +14,15 @@
"setup": [ "setup": [
"pip install nose" "pip install nose"
] ]
},
"flask": {
"repo": "https://github.com/pallets/flask.git",
"sha": "21c3df31de4bc2f838c945bd37d185210d9bab1a",
"module_command": "pytest -c /dev/null tests examples",
"setup": [
"pip install -r requirements/tests.txt",
"pip install -q -e examples/tutorial[test]",
"pip install -q -e examples/javascript[test]"
]
} }
} }

View File

@@ -1,4 +1,5 @@
import dataclasses import dataclasses
import inspect
import logging import logging
import os import os
import sys import sys
@@ -104,6 +105,9 @@ _unknown_module_fixup_cache = dict()
def _unkown_module_fixup(func): def _unkown_module_fixup(func):
# TODO: Doesn't work for everything (for example: `OrderedDict.fromkeys`, `object.__new__`) # TODO: Doesn't work for everything (for example: `OrderedDict.fromkeys`, `object.__new__`)
# TODO: Can make this logic easier by using `func.__self__`. For `f = dict().get`, `f.__self__.__class__ == dict`
# and `dict.__new__.__self__ = dict`
module = func.__module__ module = func.__module__
qualname = func.__qualname__ qualname = func.__qualname__
cls_name, method_name = qualname.split(".") cls_name, method_name = qualname.split(".")
@@ -114,12 +118,20 @@ def _unkown_module_fixup(func):
matching_classes = list() matching_classes = list()
for klass in object.__subclasses__(): for klass in object.__subclasses__():
# type(dict.get) == METHOD_DESCRIPTOR_TYPE
# type(dict.__new__) == BUILTIN_FUNCTION_OR_METHOD if inspect.isabstract(klass):
if klass.__qualname__ == cls_name and type( continue
getattr(klass, method_name, None)
) in [BUILTIN_FUNCTION_OR_METHOD, METHOD_DESCRIPTOR_TYPE]: try:
matching_classes.append(klass) # type(dict.get) == METHOD_DESCRIPTOR_TYPE
# type(dict.__new__) == BUILTIN_FUNCTION_OR_METHOD
if klass.__qualname__ == cls_name and type(
getattr(klass, method_name, None)
) in [BUILTIN_FUNCTION_OR_METHOD, METHOD_DESCRIPTOR_TYPE]:
matching_classes.append(klass)
# For flask, observed to give `ValueError: Namespace class is abstract`, even with the isabstract above
except ValueError:
pass
if len(matching_classes) == 1: if len(matching_classes) == 1:
klass = matching_classes[0] klass = matching_classes[0]