Source code for heros.inspect
HERO_EVENT_ATTRIBUTE = "hero_event"
HERO_METHOD_ATTRIBUTE = "hero_method"
LOCAL_ONLY_ATTRIBUTE = "local_only"
FORCE_REMOTE_ATTRIBUTE = "force_remote"
[docs]
def _mark(func: callable, marker: str) -> callable:
"""
Mark a callable with a provided marker.
Args:
func: callable to mark
marker: attribute name at which to mark the callable
Returns:
The marked callable.
"""
setattr(func, marker, True)
return func
[docs]
def _is_marked(func: callable, marker: str) -> bool:
"""
Inspect if a callable is marked with a provided marker.
Args:
func: callable to check
marker: attribute name of the attribute to check
Returns:
The value of the marker.
`False` if the marker is not present.
"""
return getattr(func, marker, False)
# I know these could be perfectly auto-generated
# Yet, we do it explicitly here for the sake of debugging
[docs]
def mark_hero_event(func: callable) -> callable:
"""
Mark a callable as a event.
Args:
func: callable to mark
Returns:
The marked callable.
"""
return _mark(func, HERO_EVENT_ATTRIBUTE)
[docs]
def mark_hero_method(func: callable) -> callable:
"""
Mark a callable as a method of a (remote) hero.
Args:
func: callable to mark
Returns:
The marked callable.
"""
return _mark(func, HERO_METHOD_ATTRIBUTE)
[docs]
def mark_local_only(func: callable) -> callable:
"""
Mark a callable is local only.
Args:
func: callable to mark
Returns:
The marked callable.
"""
return _mark(func, LOCAL_ONLY_ATTRIBUTE)
# rename mark_local_only to use as a decorator
local_only = mark_local_only
[docs]
def mark_force_remote(func: callable) -> callable:
"""
Mark a callable as force remote.
Args:
func: callable to mark
Returns:
The marked callable.
"""
return _mark(func, FORCE_REMOTE_ATTRIBUTE)
# rename mark_force_remote to use as a decorator
force_remote = mark_force_remote
[docs]
def is_hero_event(func: callable) -> bool:
"""
Check if a callable is a event.
Args:
func: callable to check
Returns:
The value of the marker.
`False` if the marker is not present.
"""
return _is_marked(func, HERO_EVENT_ATTRIBUTE)
[docs]
def is_hero_method(func: callable) -> bool:
"""
Check if a callable is a method of a (remote) hero.
Args:
func: callable to check
Returns:
The value of the marker.
`False` if the marker is not present.
"""
return _is_marked(func, HERO_METHOD_ATTRIBUTE)
[docs]
def is_local_only(func: callable) -> bool:
"""
Check if a callable is a local only.
Args:
func: callable to check
Returns:
The value of the marker.
`False` if the marker is not present.
"""
return _is_marked(func, LOCAL_ONLY_ATTRIBUTE)
[docs]
def is_force_remote(func: callable) -> bool:
"""
Check if a callable is a force remote.
Args:
func: callable to check
Returns:
The value of the marker.
`False` if the marker is not present.
"""
return _is_marked(func, FORCE_REMOTE_ATTRIBUTE)