Skip to main content

A Python utility for AWS cron expressions. Validate and parse AWS EventBridge cron expressions seamlessly.

Project description

AWS Croniter

AWS Croniter is a Python package for parsing, validating, and calculating occurrences of AWS EventBridge cron expressions. AWS cron expressions are a powerful way to schedule events, but they differ from standard Unix cron syntax. This library makes it easy to work with AWS-specific cron schedules programmatically.


PyPI PyPI Downloads PyPI - Python Version GitHub stars Tests


Table of Contents

  1. Inspiration
  2. Features
  3. Installation
  4. Usage
  5. Contributing
  6. License
  7. Contact

Inspiration

AWS Croniter was inspired by two existing packages, aws-cron-expression-validator and pyawscron, which serve similar purposes. The aws-cron-expression-validator package focuses solely on validating AWS cron expressions, while pyawscron provides functionality for parsing and calculating schedules such as next and previous occurrences. However, both packages had limitations, and users often needed to install and integrate both packages to work effectively with AWS cron schedules. AWS Croniter was developed to address these issues by combining the features of both packages into a single, robust solution that also provides an improved and comprehensive tool for working with AWS cron expressions.


Features

  • Validate AWS cron expressions against AWS EventBridge syntax.
  • Parse and interpret cron rules with detailed validation error messages.
  • Compute:
    • Next and previous occurrence times for a given schedule.
    • All occurrences of a schedule between two given dates.
    • Final execution time between two given dates (optimized for performance).
  • Handle special AWS cron syntax (e.g., ?, L, W, #) and aliases for months (JAN, FEB, ...) and days of the week (SUN, MON, ...).

Installation

Install the package via pip:

pip install aws-croniter

Usage

AWS Cron Expression Example

from aws_croniter import AwsCroniter

cron_expression = "0 12 15 * ? 2023"  # AWS cron syntax
aws_cron = AwsCroniter(cron_expression)

Handling Invalid Cron Expressions

When an invalid AWS cron expression is passed, AwsCroniter raises specific exceptions indicating the nature of the error:

from aws_croniter import AwsCroniter
from aws_croniter.exceptions import AwsCroniterExpressionError

try:
    invalid_cron = "0 18 ? * MON-FRI"  # Missing fields
    AwsCroniter(invalid_cron)
except AwsCroniterExpressionError as e:
    print(f"Invalid cron expression: {e}")
# Output: Invalid cron expression: Incorrect number of values in '0 18 ? * MON-FRI'. 6 required, 5 provided.

Fetching the Next Occurrence

The get_next method retrieves the next occurrence(s) of the cron schedule from a specified date. This method always returns a list with n items and sets the items to None if no valid occurrences are found.

Basic Usage

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Starting datetime
start_date = datetime(2023, 12, 14, tzinfo=timezone.utc)
next_occurrence = aws_cron.get_next(start_date)

print(next_occurrence)
# Output: [datetime.datetime(2023, 12, 15, 12, 0, tzinfo=datetime.timezone.utc)]

Retrieving Multiple Occurrences (n > 1)

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Starting datetime
start_date = datetime(2023, 9, 14, tzinfo=timezone.utc)

# Fetch the next 3 occurrences
next_occurrences = aws_cron.get_next(start_date, n=3)

print(next_occurrences)
# Output: [datetime.datetime(2023, 9, 15, 12, 0, tzinfo=datetime.timezone.utc),
#          datetime.datetime(2023, 10, 15, 12, 0, tzinfo=datetime.timezone.utc),
#          datetime.datetime(2023, 11, 15, 12, 0, tzinfo=datetime.timezone.utc)]

Using the Inclusive Parameter

Setting inclusive=True includes the start date in the results if it matches the schedule. The default is False.

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Starting datetime
start_date = datetime(2023, 12, 15, 12, 0,
                      tzinfo=timezone.utc)
# Include the starting date in the results
next_occurrence_inclusive = aws_cron.get_next(start_date, inclusive=True)

print(next_occurrence_inclusive)
# Output: [datetime.datetime(2023, 12, 15, 12, 0, tzinfo=datetime.timezone.utc)]

Fetching the Previous Occurrence

The get_prev method retrieves the previous occurrence(s) of the cron schedule from a specified date. This method always returns a list with n items and sets the items to None if no valid occurrences are found.

Basic Usage

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Starting datetime
start_date = datetime(2023, 12, 14, tzinfo=timezone.utc)
prev_occurrence = aws_cron.get_prev(start_date)

print(prev_occurrence)
# Output: [datetime.datetime(2023, 11, 15, 12, 0, tzinfo=datetime.timezone.utc)]

Retrieving Multiple Occurrences (n > 1)

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Starting datetime
start_date = datetime(2023, 12, 14, tzinfo=timezone.utc)

# Fetch the previous 2 occurrences
prev_occurrences = aws_cron.get_prev(start_date, n=2)

print(prev_occurrences)
# Output: [datetime.datetime(2023, 11, 15, 12, 0, tzinfo=datetime.timezone.utc),
#          datetime.datetime(2023, 10, 15, 12, 0, tzinfo=datetime.timezone.utc)]

Using the Inclusive Parameter

Setting inclusive=True includes the start date in the results if it matches the schedule. The default is False.

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Starting datetime
start_date = datetime(2023, 12, 15, 12, 0,
                      tzinfo=timezone.utc)
# Include the starting date in the results
prev_occurrence_inclusive = aws_cron.get_prev(start_date, inclusive=True)

print(prev_occurrence_inclusive)
# Output: [datetime.datetime(2023, 12, 15, 12, 0, tzinfo=datetime.timezone.utc)]

Fetch All Schedules in Range

The get_all_schedule_bw_dates method retrieves all occurrences of the cron schedule between two specified dates.

Basic Usage

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Define the date range
from_date = datetime(2023, 11, 14, tzinfo=timezone.utc)
to_date = datetime(2023, 12, 31, tzinfo=timezone.utc)

# Fetch all occurrences in the range
all_occurrences = aws_cron.get_all_schedule_bw_dates(from_date, to_date)

print(all_occurrences)
# Output: [datetime.datetime(2023, 11, 15, 12, 0, tzinfo=datetime.timezone.utc),
#          datetime.datetime(2023, 12, 15, 12, 0, tzinfo=datetime.timezone.utc)]

Excluding Start and End Dates

Setting exclude_ends=True omits occurrences that match the start and end dates. The default is False.

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Define the date range
from_date = datetime(2023, 11, 14, tzinfo=timezone.utc)
to_date = datetime(2023, 12, 31, tzinfo=timezone.utc)
# Exclude the start and end dates from the results
all_occurrences_exclude_ends = aws_cron.get_all_schedule_bw_dates(from_date, to_date, exclude_ends=True)

print(all_occurrences_exclude_ends)
# Output: [datetime.datetime(2023, 11, 15, 12, 0, tzinfo=datetime.timezone.utc), 
#          datetime.datetime(2023, 12, 15, 12, 0, tzinfo=datetime.timezone.utc)]

Get Final Execution Time

The get_final_execution_time method retrieves the final execution datetime between two specified dates. The to_date is exclusive, meaning if it exactly matches the cron expression, it will not be included in the result. Only executions strictly before to_date will be returned.

Basic Usage

from aws_croniter import AwsCroniter
from datetime import datetime, timezone

# AWS cron expression
cron_expression = "0 12 15 * ? 2023"
aws_cron = AwsCroniter(cron_expression)

# Define the date range
from_date = datetime(2023, 11, 14, tzinfo=timezone.utc)
to_date = datetime(2023, 12, 31, tzinfo=timezone.utc)

# Get the final execution time in the range
final_execution = aws_cron.get_final_execution_time(from_date, to_date)

print(final_execution)
# Output: datetime.datetime(2023, 12, 15, 12, 0, tzinfo=datetime.timezone.utc)

Contributing

Contributions are welcome! Please read the contributing guidelines first.


License

This project is licensed under the MIT License. See the LICENSE file for details.


Contact

For any questions or suggestions, please open an issue or contact the maintainer at hello@techwithsid.com.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aws_croniter-1.0.5.tar.gz (12.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aws_croniter-1.0.5-py3-none-any.whl (11.9 kB view details)

Uploaded Python 3

File details

Details for the file aws_croniter-1.0.5.tar.gz.

File metadata

  • Download URL: aws_croniter-1.0.5.tar.gz
  • Upload date:
  • Size: 12.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aws_croniter-1.0.5.tar.gz
Algorithm Hash digest
SHA256 e6a0741b6d4e1545704db10bc9a38ab64a9121ea3f12018bec3fa4d4acd9ac23
MD5 95c707a12e166ece33a86696ac678f7a
BLAKE2b-256 6f8c3bfffb30651726746ad8f21402207fd97bb576651672b3766e958d1ea932

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_croniter-1.0.5.tar.gz:

Publisher: release.yml on siddarth-patil/aws-croniter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aws_croniter-1.0.5-py3-none-any.whl.

File metadata

  • Download URL: aws_croniter-1.0.5-py3-none-any.whl
  • Upload date:
  • Size: 11.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aws_croniter-1.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 44703f646f3ab19238ec48864b8577db768b6cba71a8e3c7a7eed5b353d8bcff
MD5 ad7874e85377b2a103c7e5ac1ee4aae5
BLAKE2b-256 8b02082cd77cbc118eec5c8ded2b62df4bfd2c30b04af251873cffd99038b019

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_croniter-1.0.5-py3-none-any.whl:

Publisher: release.yml on siddarth-patil/aws-croniter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page