Module nitric.resources.schedules

Expand source code
#
# Copyright (c) 2021 Nitric Technologies Pty Ltd.
#
# This file is part of Nitric Python 3 SDK.
# See https://github.com/nitrictech/python-sdk for further info.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from __future__ import annotations
from nitric.application import Nitric
from nitric.faas import FunctionServer, EventMiddleware, RateWorkerOptions, Frequency


class Schedule:
    """A schedule for running functions on a cadence."""

    description: str
    server: FunctionServer

    def start(self):
        """Start the function server that executes the scheduled middleware."""
        return self.server.start()

    def __init__(self, description: str):
        """Construct a new schedule."""
        self.description = description

    def every(self, rate_description: str, *middleware: EventMiddleware):
        """
        Register middleware to be run at the specified rate.

        E.g. every("3 hours")
        """
        rate_description = rate_description.lower()

        if not any([frequency in rate_description for frequency in Frequency.as_str_list()]):
            # handle singular frequencies. e.g. every('day')
            rate_description = f"1 {rate_description}s"  # 'day' becomes '1 days'

        try:
            rate, freq_str = rate_description.split(" ")
            freq = Frequency.from_str(freq_str)
        except Exception:
            raise Exception(f"invalid rate expression, frequency must be one of {Frequency.as_str_list()}")

        if not rate.isdigit():
            raise Exception("invalid rate expression, expression must begin with a positive integer")

        opts = RateWorkerOptions(self.description, int(rate), freq)

        self.server = FunctionServer(opts)
        self.server.event(*middleware)
        return Nitric._register_worker(self.server)


def schedule(description: str, every: str):
    """Return a schedule decorator."""

    def decorator(func: EventMiddleware):
        r = Schedule(description)
        r.every(every, func)
        return r

    return decorator

Functions

def schedule(description: str, every: str)

Return a schedule decorator.

Expand source code
def schedule(description: str, every: str):
    """Return a schedule decorator."""

    def decorator(func: EventMiddleware):
        r = Schedule(description)
        r.every(every, func)
        return r

    return decorator

Classes

class Schedule (description: str)

A schedule for running functions on a cadence.

Construct a new schedule.

Expand source code
class Schedule:
    """A schedule for running functions on a cadence."""

    description: str
    server: FunctionServer

    def start(self):
        """Start the function server that executes the scheduled middleware."""
        return self.server.start()

    def __init__(self, description: str):
        """Construct a new schedule."""
        self.description = description

    def every(self, rate_description: str, *middleware: EventMiddleware):
        """
        Register middleware to be run at the specified rate.

        E.g. every("3 hours")
        """
        rate_description = rate_description.lower()

        if not any([frequency in rate_description for frequency in Frequency.as_str_list()]):
            # handle singular frequencies. e.g. every('day')
            rate_description = f"1 {rate_description}s"  # 'day' becomes '1 days'

        try:
            rate, freq_str = rate_description.split(" ")
            freq = Frequency.from_str(freq_str)
        except Exception:
            raise Exception(f"invalid rate expression, frequency must be one of {Frequency.as_str_list()}")

        if not rate.isdigit():
            raise Exception("invalid rate expression, expression must begin with a positive integer")

        opts = RateWorkerOptions(self.description, int(rate), freq)

        self.server = FunctionServer(opts)
        self.server.event(*middleware)
        return Nitric._register_worker(self.server)

Class variables

var description : str
var serverFunctionServer

Methods

def every(self, rate_description: str, *middleware: EventMiddleware)

Register middleware to be run at the specified rate.

E.g. every("3 hours")

Expand source code
def every(self, rate_description: str, *middleware: EventMiddleware):
    """
    Register middleware to be run at the specified rate.

    E.g. every("3 hours")
    """
    rate_description = rate_description.lower()

    if not any([frequency in rate_description for frequency in Frequency.as_str_list()]):
        # handle singular frequencies. e.g. every('day')
        rate_description = f"1 {rate_description}s"  # 'day' becomes '1 days'

    try:
        rate, freq_str = rate_description.split(" ")
        freq = Frequency.from_str(freq_str)
    except Exception:
        raise Exception(f"invalid rate expression, frequency must be one of {Frequency.as_str_list()}")

    if not rate.isdigit():
        raise Exception("invalid rate expression, expression must begin with a positive integer")

    opts = RateWorkerOptions(self.description, int(rate), freq)

    self.server = FunctionServer(opts)
    self.server.event(*middleware)
    return Nitric._register_worker(self.server)
def start(self)

Start the function server that executes the scheduled middleware.

Expand source code
def start(self):
    """Start the function server that executes the scheduled middleware."""
    return self.server.start()