"""
"""
import re
import sys
import six
from .limits import GRANULARITIES
SEPARATORS = re.compile(r"[,;|]{1}")
SINGLE_EXPR = re.compile(
r"""
\s*([0-9]+)
\s*(/|\s*per\s*)
\s*([0-9]+)
*\s*(hour|minute|second|day|month|year)s?\s*""",
re.IGNORECASE | re.VERBOSE,
)
EXPR = re.compile(
r"^{SINGLE}(:?{SEPARATORS}{SINGLE})*$".format(
SINGLE=SINGLE_EXPR.pattern, SEPARATORS=SEPARATORS.pattern
),
re.IGNORECASE | re.VERBOSE,
)
def get_dependency(dep):
"""
safe function to import a module programmatically
:return: module or None (if not importable)
"""
try:
__import__(dep)
return sys.modules[dep]
except ImportError: # pragma: no cover
return None
[docs]def parse_many(limit_string):
"""
parses rate limits in string notation containing multiple rate limits
(e.g. '1/second; 5/minute')
:param string limit_string: rate limit string using :ref:`ratelimit-string`
:raise ValueError: if the string notation is invalid.
:return: a list of :class:`RateLimitItem` instances.
"""
if not (isinstance(limit_string, six.string_types) and EXPR.match(limit_string)):
raise ValueError("couldn't parse rate limit string '%s'" % limit_string)
limits = []
for limit in SEPARATORS.split(limit_string):
amount, _, multiples, granularity_string = SINGLE_EXPR.match(limit).groups()
granularity = granularity_from_string(granularity_string)
limits.append(granularity(amount, multiples))
return limits
[docs]def parse(limit_string):
"""
parses a single rate limit in string notation
(e.g. '1/second' or '1 per second'
:param string limit_string: rate limit string using :ref:`ratelimit-string`
:raise ValueError: if the string notation is invalid.
:return: an instance of :class:`RateLimitItem`
"""
return list(parse_many(limit_string))[0]
def granularity_from_string(granularity_string):
"""
:param granularity_string:
:return: a subclass of :class:`RateLimitItem`
:raise ValueError:
"""
for granularity in GRANULARITIES.values():
if granularity.check_granularity_string(granularity_string):
return granularity
raise ValueError("no granularity matched for %s" % granularity_string)