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. Always.
  • ⚖️ Typesafe API prevents common bugs
  • ✅ Fixes issues that 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
...    UTCDateTime,     # -> Enforce UTC-normalization
...    ZonedDateTime,   # -> Full-featured timezones
...    NaiveDateTime,   # -> Without any timezone
... )

>>> py311_release = UTCDateTime(2022, 10, 24, hour=17)
UTCDateTime(2022-10-24 17:00:00Z)

# Simple, explicit conversions
>>> py311_release.to_tz("Europe/Paris")
ZonedDateTime(2022-10-24 19:00:00+02:00[Europe/Paris])

# Comparison and equality
>>> UTCDateTime.now() > py311_release
True

# Naive type that can't accidentally mix with aware types.
# Only explicit assumptions will make it aware
>>> hackathon_invite = NaiveDateTime(2023, 10, 28, hour=12)
>>> hackathon_start = hackathon_invite.assume_tz("Europe/Amsterdam")
ZonedDateTime(2023-10-28 12:00:00+02:00[Europe/Amsterdam])

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

# Formatting & parsing common formats (ISO, RFC3339, RFC2822)
>>> py311_release.format_rfc2822()
"Mon, 24 Oct 2022 17:00:00 GMT"

# If you must: you can convert to/from the standard lib
>>> py311_release.py_datetime()
datetime.datetime(2022, 10, 24, 17, 0, 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
    • 🚧 Intervals
    • 🚧 Improved parsing and formatting
  • 🔒 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.0rc0.tar.gz (136.6 kB view details)

Uploaded Source

Built Distributions

whenever-0.6.0rc0-cp312-cp312-win_amd64.whl (228.2 kB view details)

Uploaded CPython 3.12 Windows x86-64

whenever-0.6.0rc0-cp312-cp312-win32.whl (254.6 kB view details)

Uploaded CPython 3.12 Windows x86

whenever-0.6.0rc0-cp312-cp312-musllinux_1_1_x86_64.whl (393.1 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

whenever-0.6.0rc0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (361.0 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

whenever-0.6.0rc0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (418.7 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

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

Uploaded CPython 3.12 macOS 11.0+ ARM64

whenever-0.6.0rc0-cp311-cp311-win_amd64.whl (226.8 kB view details)

Uploaded CPython 3.11 Windows x86-64

whenever-0.6.0rc0-cp311-cp311-win32.whl (253.0 kB view details)

Uploaded CPython 3.11 Windows x86

whenever-0.6.0rc0-cp311-cp311-musllinux_1_1_x86_64.whl (392.2 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

whenever-0.6.0rc0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (360.2 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

whenever-0.6.0rc0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (416.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

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

Uploaded CPython 3.11 macOS 11.0+ ARM64

whenever-0.6.0rc0-cp310-cp310-win_amd64.whl (226.8 kB view details)

Uploaded CPython 3.10 Windows x86-64

whenever-0.6.0rc0-cp310-cp310-win32.whl (253.0 kB view details)

Uploaded CPython 3.10 Windows x86

whenever-0.6.0rc0-cp310-cp310-musllinux_1_1_x86_64.whl (392.2 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

whenever-0.6.0rc0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (360.2 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

whenever-0.6.0rc0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (416.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

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

Uploaded CPython 3.10 macOS 11.0+ ARM64

whenever-0.6.0rc0-cp39-cp39-win_amd64.whl (226.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

whenever-0.6.0rc0-cp39-cp39-win32.whl (252.0 kB view details)

Uploaded CPython 3.9 Windows x86

whenever-0.6.0rc0-cp39-cp39-musllinux_1_1_x86_64.whl (392.8 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

whenever-0.6.0rc0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (360.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

whenever-0.6.0rc0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (415.8 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

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

Uploaded CPython 3.9 macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for whenever-0.6.0rc0.tar.gz
Algorithm Hash digest
SHA256 5a7a5c1a2402611628fa300a1a0f54f52b4dbeccfa60a4bfeb8e9f08bd6d9a3b
MD5 3db3abc9c40a78137583b3f3f67e2538
BLAKE2b-256 845c21de8b0156ba62e93a92ce89dbb2d1971ba3352ddc7380015bae9a900f14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 327b0aefad7517c4145e50b54879b265444f9a3311a669532c3a079f62b27af2
MD5 622b5e436ec68cd5256b0024fa9caf8c
BLAKE2b-256 c49f0200d1185f290caa07890f716967703f728b2251316bdecd7a5459683ae8

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for whenever-0.6.0rc0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 510e2f762c481f6f2379031b5c3543365bea3abc0d3f99734350d955c5bcf676
MD5 840a6ee9428110e7d40df28f9581d4b6
BLAKE2b-256 70f9356552dc5f0f58e6df8e25034543017f80ef932ef548bc9ed7cf61b331cb

See more details on using hashes here.

File details

Details for the file whenever-0.6.0rc0-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 1e1255ff6b53fbbd61acd2d9fbd0b87934daff712f8b64f9cbace31671af6f15
MD5 0abd9d9f82ac370fec6d5c5222386286
BLAKE2b-256 941d67f460f03d7fa0f0efebbce9c8f4a8d4718181372dc4357ed630de54ccbf

See more details on using hashes here.

File details

Details for the file whenever-0.6.0rc0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6662b14c22610c3e3b580e448e994e1d63b5356cd7709eba1199265f0f183de9
MD5 1006a6bd45713065ebc426dd8136ab30
BLAKE2b-256 a94aa765c53e1cbc1da3ffc39e3902dc322ec7e738addbd2fedd1e7e27d9ea51

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 01a9fe64b0a00c362c85cff9243d6ff3d6acba7fd1d11c12e322719592f5972b
MD5 3f2c907cdc7e3e26684b20275a2c8a84
BLAKE2b-256 59e5a217e4506f2b0ef4f11a9c7542d759bee53e8dd6e3e78268453018154a38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ea2e992516fa1bcd3885bd4ea92a18a95c0f01eb1d7ed921b2ca60ceb385566
MD5 ec138e0e712d92d7b8746ac69db19b40
BLAKE2b-256 6a96830d8a9b98d21e697344880c32f1cc4d389101adddbdb4161a6696a01407

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 effb66fe608352cbfe420c6468970313e25067bdbe8043d5fb09dec5b674d2cf
MD5 3e798c745e24d8d64ca5e556fb9101c1
BLAKE2b-256 bcde8073d2eaa7b4646d00d0d9221f58097d5220dd3f697c5f7316ce724a9d73

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for whenever-0.6.0rc0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 7292426bac8dbd45006e8dbaf393d987a6063b171f7e08a9a6b725ba788ff1a8
MD5 468f0df6b38c53c2b3d87bbcfc188bf1
BLAKE2b-256 478a8be404abdf40a67992df60991f9718318e5f532588c9ad91ac2b3a10b8fb

See more details on using hashes here.

File details

Details for the file whenever-0.6.0rc0-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a4b553062b66e89483046d5886c92beb99ed114ff262df25d7284544800dd61c
MD5 91ae5e16ca56cb400db16fae1e0c7207
BLAKE2b-256 d396666ced86d2638042c135e0f467916a44e37a2a3d774afc2e4f81ed7fd913

See more details on using hashes here.

File details

Details for the file whenever-0.6.0rc0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4d2e49e12fabdca79894a80c1bc33e4a20b0e2994033279b05a1c1f43fa3ce3e
MD5 500d53c5947784cc3b7d17a336b7438e
BLAKE2b-256 fea4800151c00dad9414215ef842021bee72bfc19a5bbfbb0f2226a1d3a3b252

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7efea1dfd97ce81b2b10f33de6553035ec5dff3753ec5317150fe34e83cd0876
MD5 a19dc6d2cd2471fb539fad652a019033
BLAKE2b-256 134aabcb017cb24ad0eb4766908930a15060dcbc7a8afcb3f2fa50dbc7383949

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3a3563ff011e5aad0c327bc5ebe2d602f3a0526d7c1898bbe37c287d647029b8
MD5 92e3680d2a595b7a269928e119aab001
BLAKE2b-256 9efda01a1d6aafdbe1dcf7e396bb52226457fdeb305362ca5bce782f6d42f663

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d393ebd62f6bccee25a74f1659ee31f1b618a08d732c2f5cb2f1a8ac6903e5b3
MD5 13b0f875cca17b9164f3384c6ac451b3
BLAKE2b-256 b51142131c5b91af274b0bbe3fddd631976d0277f262bc152435698ce3ac6b30

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for whenever-0.6.0rc0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 14e139489d405cdfab521990adbe39a3eea7eeba99add297b942c145713feb4d
MD5 c0765cbbfc58854be089706bd8a4277d
BLAKE2b-256 65cf2e89e37ddc4536ea829294032673b6a5bc5b17042ba40282bc02b2fe5f91

See more details on using hashes here.

File details

Details for the file whenever-0.6.0rc0-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 36e75a0cabe2eb0cf54fa2eb40a83c5a9085c825a889ce94cc957b056f8d6946
MD5 15f1981bb26e8d26d119e45d288182cd
BLAKE2b-256 6b81d35b6d9cacf041a38741672b5242e77dbe6783f83a8023cfc193a70c1366

See more details on using hashes here.

File details

Details for the file whenever-0.6.0rc0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 88e2d7dc52bf0bff7cc8b5100cd147cc785faee2874b2b90759029dcc403ae2b
MD5 fd90b41752d098940059214388b6eb96
BLAKE2b-256 0eadfd6ad3cdc5c1566dc529fbadd632ba0f986d7e83707353eb6f1fae667d4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ae6e14c5c1167df78c82a8f62e77bb67382b9673c1330d31cf36ebd0fc886bf3
MD5 a96b760fb4a6bf15512bd6c8269892f7
BLAKE2b-256 7addea66f4afee63ed0755f99d4ebb3c4f2f1a3076c1f14d0429e060f2914c03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 97288d7e0923b9bcb22afb4b061df1ccf121f944040865700e9333784c7e4a62
MD5 34348b7abf1bf8a0a26f4e0de0eab891
BLAKE2b-256 8e16ae0a168728e5d312ad811e6a55354474b769adc079748686429d693dd0a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 2b5fc6ae675f73d08623a99d971665e836f40d4c0acdabd909793f14fcfd443d
MD5 0b7122371a7b6157b03b72a43302aa60
BLAKE2b-256 347f5944f07820b195fca5c122d82a86cb554545e07f2090818334e95bb5fa47

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for whenever-0.6.0rc0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 eb4c0abc344542f04f59f2c4680d13c68437a365f115317d5591b98468c0b7cf
MD5 f41e9ae6cfd5a24dc19b9daab32c411f
BLAKE2b-256 1a43e7f2e1373a5ee916efbc3f1feace897886dad3de71995b6b9a0db06ccf02

See more details on using hashes here.

File details

Details for the file whenever-0.6.0rc0-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 eec85bc94c276e9ee454dd915bb4a0a7b87534b9014651968db5c09f87fe92fd
MD5 8833b01ad21d9c6bc15bcfb3ef26d730
BLAKE2b-256 1b06777f8609515ab3353c8a84b72c4add74d32a5f8b0888eab026e0537f6184

See more details on using hashes here.

File details

Details for the file whenever-0.6.0rc0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7bb4dd7fb9fa5818baf53f063f9b1d98a77df3a54db98fdda0ea19c7dfb777d2
MD5 dd60a3c09e2cad94d41497e271f10fa8
BLAKE2b-256 a74c1f1e18cb46f4740b1c02af1672c3a2b82a6112bc39fca27cdf6a6e56c64a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d6895a0d760da438616d75e112b28e464d81aa07407e9713dddcb2ce4f6d64a3
MD5 59c26d8b89defbd289805d66014ff1b3
BLAKE2b-256 79defae36713f327855ab2c57121dc822e0056196c15896c7b2202012910f050

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for whenever-0.6.0rc0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a4e30b5c5cf83ab14415cfb766b794a4597c9fc081890d98f95cc888b380b19
MD5 a3c7965447c290d74e2f9ed9b9cfba3e
BLAKE2b-256 c777cda32de3a656b8810ea3c23500d48cf854338584627cd22e2d89375b8208

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