Module hug.introspect
hug/introspect.py
Defines built in hug functions to aid in introspection
Copyright (C) 2016 Timothy Edmund Crosley
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
View Source
"""hug/introspect.py Defines built in hug functions to aid in introspection Copyright (C) 2016 Timothy Edmund Crosley Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from __future__ import absolute_import import inspect from types import MethodType def is_method(function): """Returns True if the passed in function is identified as a method (NOT a function)""" return isinstance(function, MethodType) def is_coroutine(function): """Returns True if the passed in function is a coroutine""" return function.__code__.co_flags & 0x0080 or getattr(function, "_is_coroutine", False) def name(function): """Returns the name of a function""" return function.__name__ def arguments(function, extra_arguments=0): """Returns the name of all arguments a function takes""" if not hasattr(function, "__code__"): return () return function.__code__.co_varnames[: function.__code__.co_argcount + extra_arguments] def takes_kwargs(function): """Returns True if the supplied function takes keyword arguments""" return bool(function.__code__.co_flags & 0x08) def takes_args(function): """Returns True if the supplied functions takes extra non-keyword arguments""" return bool(function.__code__.co_flags & 0x04) def takes_arguments(function, *named_arguments): """Returns the arguments that a function takes from a list of requested arguments""" return set(named_arguments).intersection(arguments(function)) def takes_all_arguments(function, *named_arguments): """Returns True if all supplied arguments are found in the function""" return bool(takes_arguments(function, *named_arguments) == set(named_arguments)) def generate_accepted_kwargs(function, *named_arguments): """Dynamically creates a function that when called with dictionary of arguments will produce a kwarg that's compatible with the supplied function """ if hasattr(function, "__code__") and takes_kwargs(function): function_takes_kwargs = True function_takes_arguments = [] else: function_takes_kwargs = False function_takes_arguments = takes_arguments(function, *named_arguments) def accepted_kwargs(kwargs): if function_takes_kwargs: return kwargs elif function_takes_arguments: return {key: value for key, value in kwargs.items() if key in function_takes_arguments} return {} return accepted_kwargs
Functions
arguments
def arguments( function, extra_arguments=0 )
Returns the name of all arguments a function takes
View Source
def arguments(function, extra_arguments=0): """Returns the name of all arguments a function takes""" if not hasattr(function, "__code__"): return () return function.__code__.co_varnames[: function.__code__.co_argcount + extra_arguments]
generate_accepted_kwargs
def generate_accepted_kwargs( function, *named_arguments )
Dynamically creates a function that when called with dictionary of arguments will produce a kwarg that's compatible with the supplied function
View Source
def generate_accepted_kwargs(function, *named_arguments): """Dynamically creates a function that when called with dictionary of arguments will produce a kwarg that's compatible with the supplied function """ if hasattr(function, "__code__") and takes_kwargs(function): function_takes_kwargs = True function_takes_arguments = [] else: function_takes_kwargs = False function_takes_arguments = takes_arguments(function, *named_arguments) def accepted_kwargs(kwargs): if function_takes_kwargs: return kwargs elif function_takes_arguments: return {key: value for key, value in kwargs.items() if key in function_takes_arguments} return {} return accepted_kwargs
is_coroutine
def is_coroutine( function )
Returns True if the passed in function is a coroutine
View Source
def is_coroutine(function): """Returns True if the passed in function is a coroutine""" return function.__code__.co_flags & 0x0080 or getattr(function, "_is_coroutine", False)
is_method
def is_method( function )
Returns True if the passed in function is identified as a method (NOT a function)
View Source
def is_method(function): """Returns True if the passed in function is identified as a method (NOT a function)""" return isinstance(function, MethodType)
name
def name( function )
Returns the name of a function
View Source
def name(function): """Returns the name of a function""" return function.__name__
takes_all_arguments
def takes_all_arguments( function, *named_arguments )
Returns True if all supplied arguments are found in the function
View Source
def takes_all_arguments(function, *named_arguments): """Returns True if all supplied arguments are found in the function""" return bool(takes_arguments(function, *named_arguments) == set(named_arguments))
takes_args
def takes_args( function )
Returns True if the supplied functions takes extra non-keyword arguments
View Source
def takes_args(function): """Returns True if the supplied functions takes extra non-keyword arguments""" return bool(function.__code__.co_flags & 0x04)
takes_arguments
def takes_arguments( function, *named_arguments )
Returns the arguments that a function takes from a list of requested arguments
View Source
def takes_arguments(function, *named_arguments): """Returns the arguments that a function takes from a list of requested arguments""" return set(named_arguments).intersection(arguments(function))
takes_kwargs
def takes_kwargs( function )
Returns True if the supplied function takes keyword arguments
View Source
def takes_kwargs(function): """Returns True if the supplied function takes keyword arguments""" return bool(function.__code__.co_flags & 0x08)