Skip to content

Commit

Permalink
Workable chainable decorator
Browse files Browse the repository at this point in the history
  • Loading branch information
timothycrosley committed Jan 25, 2016
1 parent b410d92 commit ed5d008
Showing 1 changed file with 35 additions and 33 deletions.
68 changes: 35 additions & 33 deletions hug/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -475,9 +475,40 @@ def decorator(api_function):
return decorator


def _call(urls=None, accept=HTTP_METHODS, parameters=None, defaults={}, output=None, examples=(), versions=None,
parse_body=True, transform=None, requires=()):
'''Defines the base Hug API creating decorator, which exposes normal python methods as HTTP APIs'''
urls = (urls, ) if isinstance(urls, str) else urls
examples = (examples, ) if isinstance(examples, str) else examples
versions = (versions, ) if isinstance(versions, (int, float, None.__class__)) else versions
requires = (requires, ) if not isinstance(requires, (tuple, list)) else requires

def decorator(api_function):
module = _api_module(api_function.__module__)
(interface, callable_method) = _create_interface(module, api_function, output=output,
parameters=parameters, defaults=defaults,
versions=versions, parse_body=parse_body, transform=transform,
requires=requires)

use_examples = examples
if not interface.required and not use_examples:
use_examples = (True, )
for url in urls or ("/{0}".format(api_function.__name__), ):
handlers = module.__hug__.routes.setdefault(url, {})
for method in accept:
version_mapping = handlers.setdefault(method.upper(), {})
for version in versions:
version_mapping[version] = interface
module.__hug__.versioned.setdefault(version, {})[callable_method.__name__] = callable_method

interface.examples = use_examples
return callable_method
return decorator


class APIRoute(object):

def __init__(urls=None, accept=HTTP_METHODS, parameters=None, defaults={}, output=None, examples=(),
def __init__(self, urls=None, accept=HTTP_METHODS, parameters=None, defaults={}, output=None, examples=(),
versions=None, parse_body=True, transform=None, requires=()):
self.urls = urls
self.accept = accept
Expand All @@ -490,8 +521,8 @@ def __init__(urls=None, accept=HTTP_METHODS, parameters=None, defaults={}, outpu
self.transform = transform
self.requires = requires

def __call__():
return _call(**vars(self))
def __call__(self, function):
return _call(**vars(self))(function)

def where(self, **overrides):
route_data = vars(self).copy()
Expand Down Expand Up @@ -576,36 +607,7 @@ def requires(self, requirements, **overrides):
'''Adds additional requirements to the specified route'''
return self.where(requirements=tuple(getattr(self, 'requirements', ())) + tuple(requirements), **overrides)


def _call(urls=None, accept=HTTP_METHODS, parameters=None, defaults={}, output=None, examples=(), versions=None,
parse_body=True, transform=None, requires=()):
'''Defines the base Hug API creating decorator, which exposes normal python methods as HTTP APIs'''
urls = (urls, ) if isinstance(urls, str) else urls
examples = (examples, ) if isinstance(examples, str) else examples
versions = (versions, ) if isinstance(versions, (int, float, None.__class__)) else versions
requires = (requires, ) if not isinstance(requires, (tuple, list)) else requires

def decorator(api_function):
module = _api_module(api_function.__module__)
(interface, callable_method) = _create_interface(module, api_function, output=output,
parameters=parameters, defaults=defaults,
versions=versions, parse_body=parse_body, transform=transform,
requires=requires)

use_examples = examples
if not interface.required and not use_examples:
use_examples = (True, )
for url in urls or ("/{0}".format(api_function.__name__), ):
handlers = module.__hug__.routes.setdefault(url, {})
for method in accept:
version_mapping = handlers.setdefault(method.upper(), {})
for version in versions:
version_mapping[version] = interface
module.__hug__.versioned.setdefault(version, {})[callable_method.__name__] = callable_method

interface.examples = use_examples
return callable_method
return decorator
call = APIRoute


def cli(name=None, version=None, doc=None, transform=None, output=None):
Expand Down

0 comments on commit ed5d008

Please sign in to comment.