# Quickstart

Note

In an async context, simply substitute the imports from `limits` to `limits.aio` and use `await` in the storage and limiter methods.

## Initialize the strategy & storage

### Initialize the storage backend

### Initialize a rate limiter

## Describe the rate limit

### Initialize a rate limit using the string notation

    from limits import parse
    one_per_minute = parse("1/minute")

### Initialize a rate limit explicitly using a subclass of `RateLimitItem`

    from limits import RateLimitItemPerSecond
    one_per_second = RateLimitItemPerSecond(1, 1)

## Test the limits

### Consume the limits

    assert True == limiter.hit(one_per_minute, "test_namespace", "foo")
    assert False == limiter.hit(one_per_minute, "test_namespace", "foo")
    assert True == limiter.hit(one_per_minute, "test_namespace", "bar")

    assert True == limiter.hit(one_per_second, "test_namespace", "foo")
    assert False == limiter.hit(one_per_second, "test_namespace", "foo")
    time.sleep(1)
    assert True == limiter.hit(one_per_second, "test_namespace", "foo")

### Check without consuming

    assert True == limiter.hit(one_per_second, "test_namespace", "foo")
    while not limiter.test(one_per_second, "test_namespace", "foo"):
        time.sleep(0.01)
    assert True == limiter.hit(one_per_second, "test_namespace", "foo")

### Query available capacity and reset time

    assert True == limiter.hit(one_per_minute, "test_namespace", "foo")
    window = limiter.get_window_stats(one_per_minute, "test_namespace", "foo")
    assert window.remaining == 0
    assert False == limiter.hit(one_per_minute, "test_namespace", "foo")
    time.sleep(window.reset_time - time.time())
    assert True == limiter.hit(one_per_minute, "test_namespace", "foo")

## Clear a limit

    assert True == limiter.hit(one_per_minute, "test_namespace", "foo")
    assert False == limiter.hit(one_per_minute, "test_namespace", "foo")
    limiter.clear(one_per_minute, "test_namespace", "foo")
    assert True == limiter.hit(one_per_minute, "test_namespace", "foo")

# Rate limit string notation

Instead of manually constructing instances of `RateLimitItem` you can instead use the following Parsing functions.

- `parse()`

- `parse_many()`

These functions accept rate limits specified as strings following the format:

    [count] [per|/] [n (optional)] [second|minute|hour|day|month|year]

You can combine rate limits by separating them with a delimiter of your choice.

## Examples

- `10 per hour`

- `10/hour`

- `10/hour;100/day;2000 per year`

- `100/day, 500/7days`