Skip to main content

Sensible and typesafe datetimes

Project description

⏰ Whenever

Typed and DST-safe datetimes for Python, written in Rust

Do you cross your fingers every time you work with Python's datetime—hoping that you didn't mix naive and aware? or that you avoided its other pitfalls? or that you properly accounted for Daylight Saving Time (DST)? There’s no way to be sure...

✨ Until now! ✨

Whenever helps you write correct and type checked datetime code. Mistakes become red squiggles in your IDE, instead of bugs in production. It's also way faster than other third-party libraries—and usually the standard library as well.

Shows a bar chart with benchmark results.

RFC3339-parse, normalize, compare to now, shift, and change timezone (1M times)

⚠️ Note: Whenever is in pre-1.0 beta. The API may change as we gather feedback and improve the library. Leave a ⭐️ on github if you'd like to see how this project develops!

Why not the standard library?

Over 20+ years, Python's datetime has grown out of step with what you'd expect from a modern datetime library. Two points stand out:

  1. It doesn't always account for Daylight Saving Time (DST). Here is a simple example:

    bedtime = datetime(2023, 3, 25, 22, tzinfo=ZoneInfo("Europe/Paris"))
    full_rest = bedtime + timedelta(hours=8)
    # It returns 6am, but should be 7am—because we skipped an hour due to DST!
    

    Note this isn't a bug, but a design decision that DST is only considered when calculations involve two timezones. If you think this is surprising, you are not alone.

  2. Typing can't distinguish between naive and aware datetimes. Your code probably only works with one or the other, but there's no way to enforce this in the type system!

    # Does this expect naive or aware? Can't tell!
    def schedule_meeting(at: datetime) -> None: ...
    

Why not other libraries?

There are two other popular third-party libraries, but they don't (fully) address these issues. Here's how they compare to whenever and the standard library:

Whenever datetime Arrow Pendulum
DST-safe ⚠️
Typed aware/naive
Fast

Arrow is probably the most historically popular 3rd party datetime library. It attempts to provide a more "friendly" API than the standard library, but doesn't address the core issues: it keeps the same footguns, and its decision to reduce the number of types to just one (arrow.Arrow) means that it's even harder for typecheckers to catch mistakes.

Pendulum arrived on the scene in 2016, promising better DST-handling, as well as improved performance. However, it only fixes some DST-related pitfalls, and its performance has significantly degraded over time. Additionally, it hasn't been actively maintained since a breaking 3.0 release last year.

Why use whenever?

  • 🌐 DST-safe arithmetic
  • 🛡️ Typesafe API prevents common bugs
  • ✅ Fixes issues arrow/pendulum don't
  • ⚖️ Based on proven and familiar concepts
  • ⚡️ Unmatched performance
  • 💎 Thoroughly tested and documented
  • 📆 Support for date arithmetic
  • ⏱️ Nanosecond precision
  • 🦀 Rust!—but with a pure-Python fallback
  • 🚀 Support for the latest GIL-related improvements (experimental)

Quickstart

>>> from whenever import (
...    # Explicit types for different use cases
...    Instant,
...    ZonedDateTime,
...    LocalDateTime,
... )

# Identify moments in time, without timezone/calendar complexity
>>> now = Instant.now()
Instant(2024-07-04 10:36:56Z)

# Simple, explicit conversions
>>> now.to_tz("Europe/Paris")
ZonedDateTime(2024-07-04 12:36:56+02:00[Europe/Paris])

# A 'naive' local time can't accidentally mix with other types.
# You need to explicitly convert it and handle ambiguity.
>>> party_invite = LocalDateTime(2023, 10, 28, hour=22)
>>> party_invite.add(hours=6)
Traceback (most recent call last):
  ImplicitlyIgnoringDST: Adjusting a local datetime implicitly ignores DST [...]
>>> party_starts = party_invite.assume_tz("Europe/Amsterdam", disambiguate="earlier")
ZonedDateTime(2023-10-28 22:00:00+02:00[Europe/Amsterdam])

# DST-safe arithmetic
>>> party_starts.add(hours=6)
ZonedDateTime(2022-10-29 03:00:00+01:00[Europe/Amsterdam])

# Comparison and equality
>>> now > party_starts
True

# Formatting & parsing common formats (ISO8601, RFC3339, RFC2822)
>>> now.format_rfc2822()
"Thu, 04 Jul 2024 10:36:56 GMT"

# If you must: you can convert to/from the standard lib
>>> now.py_datetime()
datetime.datetime(2024, 7, 4, 10, 36, 56, tzinfo=datetime.timezone.utc)

Read more in the feature overview or API reference.

Roadmap

  • 🧪 0.x: get to feature-parity, process feedback, and tweak the API:

    • ✅ Datetime classes
    • ✅ Deltas
    • ✅ Date and time of day (separate from datetime)
    • ✅ Implement Rust extension for performance
    • 🚧 Parsing leap seconds
    • 🚧 Improved parsing and formatting
    • 🚧 More helpful error messages
    • 🚧 Intervals
  • 🔒 1.0: API stability and backwards compatibility

Limitations

  • Supports the proleptic Gregorian calendar between 1 and 9999 AD
  • Timezone offsets are limited to whole seconds (consistent with IANA TZ DB)
  • No support for leap seconds (consistent with industry standards and other modern libraries)

Versioning and compatibility policy

Whenever follows semantic versioning. Until the 1.0 version, the API may change with minor releases. Breaking changes will be meticulously explained in the changelog. Since the API is fully typed, your typechecker and/or IDE will help you adjust to any API changes.

⚠️ Note: until 1.x, pickled objects may not be unpicklable across versions. After 1.0, backwards compatibility of pickles will be maintained as much as possible.

Acknowledgements

This project is inspired by the following projects. Check them out!

The benchmark comparison graph is based on the one from the Ruff project.

Contributing

Contributions are welcome! Please open an issue or a pull request.

⚠️ Note: Non-trivial changes should be discussed in an issue first. This is to avoid wasted effort if the change isn't a good fit for the project.

⚠️ Note: Some tests are skipped on Windows. These tests use unix-specific features to set the timezone for the current process. As a result, Windows isn't able to run certain tests that rely on the system timezone. It appears that this functionality (only needed for the tests) is not available on Windows.

Setting up a development environment

An example of setting up things up:

# install the dependencies
make init

# build the rust extension
make build

make test  # run the tests (Python and Rust)
make format  # apply autoformatting
make ci-lint  # various static checks
make typecheck  # run mypy and typing tests

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

whenever-0.6.0.tar.gz (139.9 kB view details)

Uploaded Source

Built Distributions

whenever-0.6.0-cp312-none-win_amd64.whl (228.1 kB view details)

Uploaded CPython 3.12 Windows x86-64

whenever-0.6.0-cp312-none-win32.whl (256.7 kB view details)

Uploaded CPython 3.12 Windows x86

whenever-0.6.0-cp312-cp312-musllinux_1_2_x86_64.whl (533.2 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

whenever-0.6.0-cp312-cp312-musllinux_1_2_i686.whl (591.2 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

whenever-0.6.0-cp312-cp312-musllinux_1_2_armv7l.whl (681.1 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARMv7l

whenever-0.6.0-cp312-cp312-musllinux_1_2_aarch64.whl (545.1 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARM64

whenever-0.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (435.2 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

whenever-0.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (400.3 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

whenever-0.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (419.4 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

whenever-0.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl (418.9 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.5+ i686

whenever-0.6.0-cp312-cp312-macosx_11_0_arm64.whl (313.7 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

whenever-0.6.0-cp312-cp312-macosx_10_12_x86_64.whl (323.4 kB view details)

Uploaded CPython 3.12 macOS 10.12+ x86-64

whenever-0.6.0-cp311-none-win_amd64.whl (226.5 kB view details)

Uploaded CPython 3.11 Windows x86-64

whenever-0.6.0-cp311-none-win32.whl (255.6 kB view details)

Uploaded CPython 3.11 Windows x86

whenever-0.6.0-cp311-cp311-musllinux_1_2_x86_64.whl (532.0 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

whenever-0.6.0-cp311-cp311-musllinux_1_2_i686.whl (589.8 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

whenever-0.6.0-cp311-cp311-musllinux_1_2_armv7l.whl (680.2 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARMv7l

whenever-0.6.0-cp311-cp311-musllinux_1_2_aarch64.whl (544.0 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARM64

whenever-0.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (433.9 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

whenever-0.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (399.3 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

whenever-0.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (418.4 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

whenever-0.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl (417.1 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.5+ i686

whenever-0.6.0-cp311-cp311-macosx_11_0_arm64.whl (312.7 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

whenever-0.6.0-cp311-cp311-macosx_10_12_x86_64.whl (321.4 kB view details)

Uploaded CPython 3.11 macOS 10.12+ x86-64

whenever-0.6.0-cp310-none-win_amd64.whl (226.5 kB view details)

Uploaded CPython 3.10 Windows x86-64

whenever-0.6.0-cp310-none-win32.whl (255.6 kB view details)

Uploaded CPython 3.10 Windows x86

whenever-0.6.0-cp310-cp310-musllinux_1_2_x86_64.whl (532.0 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

whenever-0.6.0-cp310-cp310-musllinux_1_2_i686.whl (589.8 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

whenever-0.6.0-cp310-cp310-musllinux_1_2_armv7l.whl (680.2 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARMv7l

whenever-0.6.0-cp310-cp310-musllinux_1_2_aarch64.whl (544.0 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARM64

whenever-0.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (433.9 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

whenever-0.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (399.3 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

whenever-0.6.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (418.4 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

whenever-0.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl (417.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.5+ i686

whenever-0.6.0-cp310-cp310-macosx_11_0_arm64.whl (312.7 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

whenever-0.6.0-cp310-cp310-macosx_10_12_x86_64.whl (321.4 kB view details)

Uploaded CPython 3.10 macOS 10.12+ x86-64

whenever-0.6.0-cp39-none-win_amd64.whl (226.7 kB view details)

Uploaded CPython 3.9 Windows x86-64

whenever-0.6.0-cp39-none-win32.whl (256.1 kB view details)

Uploaded CPython 3.9 Windows x86

whenever-0.6.0-cp39-cp39-musllinux_1_2_x86_64.whl (532.4 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

whenever-0.6.0-cp39-cp39-musllinux_1_2_i686.whl (590.4 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

whenever-0.6.0-cp39-cp39-musllinux_1_2_armv7l.whl (680.7 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARMv7l

whenever-0.6.0-cp39-cp39-musllinux_1_2_aarch64.whl (544.5 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARM64

whenever-0.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (434.9 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

whenever-0.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (399.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

whenever-0.6.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (419.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

whenever-0.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl (417.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.5+ i686

whenever-0.6.0-cp39-cp39-macosx_11_0_arm64.whl (313.2 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

whenever-0.6.0-cp39-cp39-macosx_10_12_x86_64.whl (322.5 kB view details)

Uploaded CPython 3.9 macOS 10.12+ x86-64

File details

Details for the file whenever-0.6.0.tar.gz.

File metadata

  • Download URL: whenever-0.6.0.tar.gz
  • Upload date:
  • Size: 139.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0.tar.gz
Algorithm Hash digest
SHA256 4e83d151dea7a09dbf626eed11f4c2d0cb57fd98599945f66518691301c63a76
MD5 1c7d2a28f58a884577b2f8d7b31b5436
BLAKE2b-256 500f6c3ee693e3a76a8680b79f784d34b7628439d9fa91c4ecbaa0714a7982cb

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-none-win_amd64.whl.

File metadata

  • Download URL: whenever-0.6.0-cp312-none-win_amd64.whl
  • Upload date:
  • Size: 228.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 e7a88230561387f4fb4c8846e3121a4f145b602fa1fe0788a82be188e68b2d45
MD5 906f001d9507dedc7bd1740ed95c7ad2
BLAKE2b-256 552a500f899374fd9ab31180c9f62c4599f8e31130bd1fbae24a8f4746b51d8e

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-none-win32.whl.

File metadata

  • Download URL: whenever-0.6.0-cp312-none-win32.whl
  • Upload date:
  • Size: 256.7 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0-cp312-none-win32.whl
Algorithm Hash digest
SHA256 dc353eb20d97f63f394fbdad37890dea7ad0cf897e1e7861c50c52ab6662eb15
MD5 0b0763f7de25271d9a716187268f5ae8
BLAKE2b-256 b3290a05533eaa23d3f66362a01f58adfba9868b1134f2812a5a15f06b5574cb

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9de3dbd595b401ba9bc330d3168cb9a04f9d362bd56df108e32a5c16716651fb
MD5 fd566199a017fadde265348248e35adf
BLAKE2b-256 b092414d0940379b36063cf9a4d21a079393e26db829b15b8d50e24fceaabd0b

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 5d5f57ed2a3d6891f83ff5b41566ffbbfaec972a70b41cebeb3959e82fee4896
MD5 ad75854bcddca273c8ef3a72fbc4a9f8
BLAKE2b-256 ab193bee0d1132c62ea856980371f7b7cc73460bf033cb67ad6cce3108e345ec

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 96adc89a3d8e74c19f24cc4af5875e50c8ed71155811bbf64139d3a192dac41a
MD5 3b95b49a72f100170672e1a5129174b2
BLAKE2b-256 dad9bd1bdf81214e2229a6c38982bb670b85637716fc4734a0e1f9d4606598a1

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 246e96801c6adbab7159cc38a3b2f1430080d75451e6bcbd28f8418da3d03074
MD5 f164b7e7442c4732f0b9d60c2d36090f
BLAKE2b-256 a95fd9b19011e73675cbd6a669289bf65cf38012210db994ac869d472c2ec5fd

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 b2446578a0ecffeb6653974822f1d396c78708e3e426c75312c2f7c49a6cdd18
MD5 a57dfb7100b3b928888e236c1c00348a
BLAKE2b-256 663d5bce6ea53ac25e9e8f7c37e26b056cda37a24ded5fa55b6446cb25466808

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 81935b247fdc4ee6bd0c8a4392655d8383575188bdd5c4a31950e5f0b2004977
MD5 22572e76c7cd8dc1c32fed9718c5e9ab
BLAKE2b-256 b414b6eb7c2ac499ee47ed64fa1e841fe142dc0e3f163d0aa4e74da513291c7e

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 1e9f8bc558c72ac8399c8073b8a91629260f0424e679f977ff70f6291f997aa1
MD5 818b998d9f7e0224760583e4d127d155
BLAKE2b-256 57cf13cd27bdcecac28fa18714bedbea464fc8aa8891628ad003851ad0099c4f

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 afd4811562863a2c09fc4aafd4a0258f7044016da15985ddda15d6422944c617
MD5 bd826c201affbbb56140ea696c0f3635
BLAKE2b-256 00e423058311ab41dacc6733abb07c621d628faee1a7d12bc45e24f4792d870a

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6bcf267e189eb8b06e196dd45054a955bbcb05ffcc2c17d6b5a8fbf55cc6caa9
MD5 a5e99b4dc2b27a3eb456bc3ff85eeff2
BLAKE2b-256 019e1b81cd54e6b04e356403e9e3d3175fa9e82fa5e3a180dbb6880e2cbc671d

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fca9b08bf38621ca7e29d8414579a4ffb0a3344c94ab2333f9188a44765f0487
MD5 532d0e10e89a816c5dd4f18c358bc75e
BLAKE2b-256 3d764a3c9a95cb7d997d4a6083a65751f97d843c659d4e0e630087ed77c4e49a

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-none-win_amd64.whl.

File metadata

  • Download URL: whenever-0.6.0-cp311-none-win_amd64.whl
  • Upload date:
  • Size: 226.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 23eb755519303b4d72ec3c578fd3dbecb434cc1f591544217adaa6142ea3f4e5
MD5 14e6390e618a209a3319a78f1ae7e4d1
BLAKE2b-256 2c3ae9f61c87aad6b649dda18bf683f64fe5f8dc2f14ecce88387bb84f8bc406

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-none-win32.whl.

File metadata

  • Download URL: whenever-0.6.0-cp311-none-win32.whl
  • Upload date:
  • Size: 255.6 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0-cp311-none-win32.whl
Algorithm Hash digest
SHA256 dbb35e8f9b1dd1605443aa7608affd62f6252a649ce8cf6a023ad114efb71081
MD5 ed7309e9e3b519ef49c046cb432c7a8e
BLAKE2b-256 37747c492c660b368661289dc6c71c6a1afbc87d09eb19104cc6bd045b50e1f3

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 538c8419d63bafee7b28f4d8e13d3a4f802bf3a1b403010ee03991f2b63a7602
MD5 6f5ebaae620c060cf0d7b747948d60c9
BLAKE2b-256 0961c83013dd0247ac1c978b08accbc0a90d722c640b016bdd651cc602bc7710

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 f2991fdbfe18ca782f79acbdd4d9d195d116141063b0c338647b22258fb659b9
MD5 f3661215eaab833c7b76b1a72cbe5a21
BLAKE2b-256 85b3806c9176126a0324cc6f7616acc77728435bd53b2ccd7353c9a36dd51d7f

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 3bc92b115fac6501e2e60cfdb96a346a69e7e4ffa20661429a0f87a2793f1752
MD5 a01429f9ac4ccdeeb8da6491ad3ff73f
BLAKE2b-256 eaaa6af590936c276626fc45f41705f3ce6a851cb9ac7dc2f1c1b9bb20a2a7ee

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 666fd2f0f38cea1be62fddbcaf887e2db47613632a09be0c03f167eee6568fd2
MD5 e947948c3f0b81e6b13f005e028080b8
BLAKE2b-256 827ba78da0c3a2780788f384a22b14420cbb6425459120231cafc09b95b5d9cf

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 3c2adf2d3ebf9bb5f71182b864491cf958727624bdcd7e2c75d6b35d6fc5901d
MD5 c5841446e12f97beb8755ed0a5346558
BLAKE2b-256 7cae250626910e7fbf639b8c98b3d0744d2d1239d53194755d1077576fabbdb3

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 cb1000621e03635abdf4c1875e70abae443ae02b1fc2af029560959267675656
MD5 fd7bd461c074de1b77a36c26e58f79ff
BLAKE2b-256 1313eade3447a48b9f8e7eda2164fb97eae473de1a9214d93b55c80bd75498da

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 3ad65d1fa44ec41d74c096d8cd73f90854fc28a763787ece9bfa663f6c54da73
MD5 5c5d94b533936e46872836ae0ee242c3
BLAKE2b-256 70c2aa290c53082506777fd70477901636c3e1a334aba690640e86b6dabc81cf

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 51440b69e004b851c1a94446090b13b8b8ef17d3aa2be18629da638537a53bf1
MD5 ea22c2be660346860951a587402e3498
BLAKE2b-256 3f2415400cb8f0d561758a83b934ad71e8efbf9d650e14e2c940d1fa1841b035

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 187eee33c85711c2a22a8fc3471b27aaf01f86639863c7f0ce027a32a57076d8
MD5 5a26389911e91b7afb3b3935ac275c9d
BLAKE2b-256 27e477d2a09a1d4776192e02411dd15af4d544b39d104fa49bb83905746721e9

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 614fbd75df7b0ea3fa069616b05b0471181f28e53ca3e989c51f28c30046c567
MD5 963094c0830d614bb4076c5ca85d656e
BLAKE2b-256 133b24e2a26dfc137b176ef13b32766961faa0b4733561c338389c029bf82a63

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-none-win_amd64.whl.

File metadata

  • Download URL: whenever-0.6.0-cp310-none-win_amd64.whl
  • Upload date:
  • Size: 226.5 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 7d7826d112c9be94fbeb74edc18ad826878e9aac0aa24a81cf1e9849faefccc9
MD5 b44d34cc756c99f8b68b44a62b41a779
BLAKE2b-256 d178839b578a3156dde3436414832fc2fc7071f7aa36414fb7709457a4009b86

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-none-win32.whl.

File metadata

  • Download URL: whenever-0.6.0-cp310-none-win32.whl
  • Upload date:
  • Size: 255.6 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0-cp310-none-win32.whl
Algorithm Hash digest
SHA256 08e41d4d2215ac15840d5e2161cb5a8f9a2a45a3e532b42e410e32c6f5595587
MD5 1645dc5027d6103758ec8cdfea116e83
BLAKE2b-256 bf54334f3ca9341858a89660c4c927571f79fe0d7f053e97a734f47b89522478

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bdf7ccc58d4bf6cd23fd30ca71f00fd8a759dc23fc95813130d69f0233764091
MD5 f165c557a3b0ef4c933b7c47596feb28
BLAKE2b-256 b19161e852f2b823081ffe7429ae78eddc9b04dcd96cc0084912a937aca24d80

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 354ab0444c9e6ea8d9a9df81a148a485c94995f53c6784bd188dcfc64cd7b763
MD5 42f17670d10350c4f1f9a88e51c1324f
BLAKE2b-256 8aa5f2bd0be36edd481642a0c344e602dd7a110763a4bfc36494b3e7fdd7849f

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 bd86149b2479b678140a5a2ae94193a7ef29a190c1007d0b6bb39875b5b64327
MD5 da942b10827de6a4ca907b0a86aed9d8
BLAKE2b-256 2afad45ba8f943cf8cf5d7a33953fc03943278e8986001d33f228b9d9075bb2e

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7603badcd9ae943a0f999cf6882803761126890d7dd38d34dc27a73f5084226a
MD5 386d93b5c37d51393eaaccab4b394dae
BLAKE2b-256 3ca21e06dfcb39b40a6c7ad253229f754e035c6072bd2cf58975118c71fe66ba

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 cf52efbc9251e4c6f2ec602828d331a82e1e7e4eb77ec436f177ddde9155898c
MD5 5fdde9af271f86deff7750cf477ccfe9
BLAKE2b-256 37e5e23b666917697bfe546dac62eebc18b167d283926f30daef24db32a77f30

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 228a87d3c3d63ec4329dfd3aee283f1084de26d226ebfe8850de871e24cdcf04
MD5 ad234805ccee74f6aa92033942c7b8b7
BLAKE2b-256 c27cff82ffaf84f0d67d88ca9b7d660ae836a831ac7928c2e35a88f55f0c5d6e

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 79e2763c1f2b4bb3e20e1e8f2935f16d96cb354bec5f41c62082b08c5c1f8b63
MD5 212d71bb448cb9fea3bcc9493ecf8246
BLAKE2b-256 ac16222c0eb9cad6ac9b1300604fd78f991906b3712d995ff9778548c01251bd

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 50ffe266765ef1c678e5ed3cff64832dcb3923944103796b52b9ae405313b323
MD5 fa6b4eb111c9380114102378ee6a6957
BLAKE2b-256 45d1687df88d85ee9ecca768a666e644c576b645f5d0c956ff26107530026f9c

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e464706709d7cccdf813080b42f216fc081cd0c97f53a5fe778fcd62993d6227
MD5 120f8d28b32c6baa159b2d01b843cc69
BLAKE2b-256 b4f75e649984914b596db1e59eca98328b9467ada7014a175ca6c1cc606d35d5

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4d6639982a32e3bb1f713684c62e41157ff96b6b9990e3a77c1aea612799dd2c
MD5 10d36b7088fd4410a9834db7227be953
BLAKE2b-256 fbf63633cffa9190b7310b88f07e9eb85ef633aad3050a16f29baa00697f5889

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-none-win_amd64.whl.

File metadata

  • Download URL: whenever-0.6.0-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 226.7 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 4fec07651304d326cec92b6ae1bcdcfb4f7e234518560e5191235729288bbcb7
MD5 6eb0bdbdd04cf5e4bfe080704fe6671d
BLAKE2b-256 3357f5759dcc0af00380005313beede2a83213ad906eb3b514e7feb445418e51

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-none-win32.whl.

File metadata

  • Download URL: whenever-0.6.0-cp39-none-win32.whl
  • Upload date:
  • Size: 256.1 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for whenever-0.6.0-cp39-none-win32.whl
Algorithm Hash digest
SHA256 5e1ff4f13b676d7519b7a98fea9a21ffa2a8e4910dda9200ac2f6e2bbef842e3
MD5 fa6c1162ba8e63d86a32299c9ed8bc21
BLAKE2b-256 0bd67b4cac2db5d058b08a7c8444b40d66141dce3f02cd74ce1d6652151773c8

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d2b2912d7588496267283514a3d190a6e07195cd8ad42df91a4c662254a23b2d
MD5 a702182bccd1c48a8cebf88db7f23d21
BLAKE2b-256 e0d9cfb49ddd1655ac1503ecc18f7c39aebe7aa8a3f68b92ece9fcddf3a87ea0

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 d019be117b71a53db28c0fd747d0a5245be0b2c188976dd5619cb8e4c102a300
MD5 61f0bc8b43f08e27cef977e72d1a7fb1
BLAKE2b-256 20d3a5af584cb9a4d05405fd1750db4c48e27d624b7924e8ac603c5f235038f1

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 c350cb838a1347b7d8115b5740a43003f8b684a4bc670e97a6d6144865844b10
MD5 db716c724b60616cab9bd82da10cc626
BLAKE2b-256 7b996a9f0714b9d244c5e5ac23dd25ad6682fcbad62fcd570c846e5eebfda418

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f1c6addfef678aa62f4d292643beffc4ffc372befdc776eb8004b588e7af9293
MD5 7b3c97f2e4ac0595a02c0140ad1b945d
BLAKE2b-256 2cde5bfbd845b6704e016e28ae880c5dcffe30e496c0c828d5e477cc7fe61ab0

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 3d34e2485c7f3c4a1a06e4b965032ba25f21902081c0695becdf4a6f4e3fa39e
MD5 c3609c81ca48ecd1e077c78ef88b9c8d
BLAKE2b-256 340b6f33241ab24315fbd4a84a6659a99f57120af6560850e27ef755bf13e94b

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 9522165e485285e6268864b1f8389b5c161523294f06f9f8cafe77aee0334f1a
MD5 b3ab1e2d5ce42e300105b64f3d1c4620
BLAKE2b-256 48bd3a49d4ef4348d711899781b23a7be9cba92ab63e57fb8d22f542f9cf9d48

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 d2b23f86b2c462a67346f4c340a2178cf79bb920432840fe448d0cea00ea26dc
MD5 416300f8d2ed0ba39590dce6391e46f5
BLAKE2b-256 83b894936100512bde90d567051bd73c302bc3a2529fc09b32bd186e96a98b24

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 a40484f2486042dd67a31d7ed210d073e808f0d73ce822396c4b07d7bd4f7ecb
MD5 4e406d149995cda40a9f578e90d0fdee
BLAKE2b-256 0412f4cac8855f0a9cd2897c9cef37e45018018761fec85701a0e05874f6c6fd

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bbcfaadc76ed2db8aa1416981629a2c5f6f2f06f0c18d8db532da8888800dae9
MD5 5cd20a73ae1d760c514fedb60bc597f2
BLAKE2b-256 f1d88f58dc446f36772db8dcec231f07604515f89f736657539551dfcd005d1e

See more details on using hashes here.

File details

Details for the file whenever-0.6.0-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0e6c563da5ef93740286a74a869d97e5f4720db27de7fb6cf131246eafd96311
MD5 9c95b35947fb07a33bb8e802af178b48
BLAKE2b-256 e131708d6b8fb1975f5e1c0671cddd2b0505abfa1f21269c8412633d950f6d7f

See more details on using hashes here.

Supported by

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