Skip to main content

Provides a high-precision thread-safe timer and helper methods to work with date and time data.

Project description

ataraxis-time

Provides a high-precision thread-safe timer and helper methods to work with date and time data.

PyPI - Version PyPI - Python Version uv Ruff type-checked: mypy PyPI - License PyPI - Status PyPI - Wheel


Detailed Description

This library uses the 'chrono' C++ library to access the fastest available system clock and use it to provide interval timing, delay, timeout, and polling functionality via a Python binding API. While the performance of the timer heavily depends on the particular system configuration and utilization, most modern CPUs should be capable of microsecond precision using this timer. Due to using a C-extension to provide interval and delay timing functionality, the library is thread- and process-safe and releases the GIL when using the appropriate delay command configuration. Additionally, the library offers a set of standalone helper functions for manipulating date and time data, including timestamp generation and parsing, time-unit conversion, rate-interval conversion, and timedelta interoperability. This library is part of the Ataraxis framework for AI-assisted scientific hardware control.

Features

  • Supports Windows, Linux, and macOS.
  • Microsecond precision on modern CPUs (~ 3 GHz+) during delay and interval timing.
  • Releases GIL during (non-blocking) delay timing even when using microsecond and nanosecond precision.
  • Timeout guard class for activity-based and duration-based timeout tracking.
  • Lap recording, human-readable elapsed time formatting, and periodic polling via an infinite generator.
  • Frequency-to-interval and interval-to-frequency conversion helpers.
  • Timestamp generation, conversion, and parsing with configurable precision levels.
  • Interoperability with Python datetime.timedelta objects.
  • Apache 2.0 License.

Table of Contents


Dependencies

For users, all library dependencies are installed automatically by all supported installation methods. For developers, see the Developers section for information on installing additional development dependencies.


Installation

Source

Note, installation from source is highly discouraged for anyone who is not an active project developer.

  1. Download this repository to the local machine using the preferred method, such as git-cloning. Use one of the stable releases that include precompiled binary and source code distribution (sdist) wheels.
  2. If the downloaded distribution is stored as a compressed archive, unpack it using the appropriate decompression tool.
  3. cd to the root directory of the prepared project distribution.
  4. Run pip install . to install the project and its dependencies.

pip

Use the following command to install the library and all of its dependencies via pip: pip install ataraxis-time


Usage

Precision Timer

The timer API is intentionally minimalistic to simplify class adoption and usage. It is heavily inspired by the elapsedMillis library for Teensy and Arduino microcontrollers.

All timer class functionality is realized through a fast C-extension class wrapped into the PrecisionTimer class.

Initialization and Configuration

The timer takes the 'precision' to use as the only initialization argument. All instances of the timer class are thread- and process-safe and do not interfere with each other.

from ataraxis_time import PrecisionTimer, TimerPrecisions

# Currently, the timer supports 4 precisions: 'ns' (nanoseconds), 'us' (microseconds), 'ms' (milliseconds), and
# 's' (seconds). All precisions are defined in the TimerPrecisions enumeration.
timer = PrecisionTimer(TimerPrecisions.MICROSECOND)
print(f"Precision: {timer.precision}")

# The precision can be adjusted after initialization if needed. While not recommended, it is possible to provide the
# precision as a string instead of using the TimerPrecisions enumeration.
timer.set_precision('ms')  # Switches timer precision to milliseconds
print(f"Precision: {timer.precision}")

Interval Timing

Interval timing functionality is realized through two methods: reset() and the elapsed property. This functionality is identical to using perf_counter_ns() from the 'time' library. The main difference is that PrecisionTimer uses a slightly different interface (reset / elapsed) and automatically converts the output to the desired precision.

from ataraxis_time import PrecisionTimer
import time as tm

timer = PrecisionTimer('us')

# Interval timing example
timer.reset()  # Resets (re-bases) the timer
tm.sleep(1)  # Simulates work (for 1 second)
print(f'Work time: {timer.elapsed} us')

Delay

Delay timing functionality is the primary advantage of this library over the standard 'time' library. At the time of writing, the 'time' library can provide nanosecond-precise delays via a 'busywait' perf_counter_ns() function that does not release the GIL. Alternatively, it can release the GIL via the sleep() function, but it is only accurate up to millisecond precision. The PrecisionTimer class can delay for time-periods within microsecond precision, while releasing or holding the GIL.

import threading
import time
from ataraxis_time import PrecisionTimer

# Instantiates a global counter for the background thread
counter = 0
stop = False


def count_in_background():
    """Background thread that increments the global counter."""
    global counter
    while not stop:
        counter += 1


# Setup
timer = PrecisionTimer('us')

# Starts the background counter thread
thread = threading.Thread(target=count_in_background, daemon=True)
thread.start()
time.sleep(0.1)

# GIL-releasing microsecond delay:
print("block=False (releases GIL):")
counter = 0  # Resets the counter
timer.delay(100, block=False)  # 100us delay
non_blocking_count = counter
print(f"counter = {counter}")

# Non-GIL-releasing microsecond delay:
print("block=True (holds GIL):")
counter = 0  # Resets the counter
timer.delay(100, block=True)  # 100us delay
blocking_count = counter
print(f"counter = {counter}")

# Cleanup
stop = True

# With microsecond precisions, blocking runtime often results in the counter not being incremented at all.
if blocking_count == 0:
    blocking_count = 1
print(f"Difference: block=False allows ~{non_blocking_count/blocking_count:.0f}x more counting!")
thread.join()

Lap Timing

The lap() method records the current elapsed time, appends it to an internal list, and resets the timer. All recorded lap times are accessible through the laps property.

from ataraxis_time import PrecisionTimer
import time as tm

timer = PrecisionTimer('ms')

# Records three laps
for i in range(3):
    tm.sleep(0.1)  # Simulates work
    duration = timer.lap()
    print(f"Lap {i + 1}: {duration} ms")

# Retrieves all recorded laps as a tuple
print(f"All laps: {timer.laps}")

Formatted Elapsed Time

The format_elapsed() method returns the current elapsed time as a human-readable string, automatically selecting the most appropriate units.

from ataraxis_time import PrecisionTimer
import time as tm

timer = PrecisionTimer('us')
tm.sleep(2.5)  # Simulates work
print(f"Elapsed: {timer.format_elapsed()}")  # e.g. "2 s 500.117 ms"
print(f"Detailed: {timer.format_elapsed(max_fields=3)}")  # e.g. "2 s 500 ms 117 us"

Polling

The poll() method provides an infinite generator that yields an iteration count after each delay cycle. This is useful for periodic task execution.

from ataraxis_time import PrecisionTimer

timer = PrecisionTimer('ms')

# Polls every 100 ms, runs 10 iterations
for count in timer.poll(100):
    print(f"Iteration {count}")
    if count >= 10:
        break

Timeout

The Timeout class provides a timeout guard built on PrecisionTimer. It supports checking whether a specified duration has elapsed and offers activity-based reset (kick) and full reset with optional duration changes.

from ataraxis_time import Timeout
import time as tm

# Creates a 500 ms timeout
timeout = Timeout(duration=500, precision='ms')

# Checks timeout status
tm.sleep(0.1)
print(f"Expired: {timeout.expired}")  # False
print(f"Remaining: {timeout.remaining} ms")
print(f"Elapsed: {timeout.elapsed} ms")

# Resets the timeout timer without changing the duration (activity-based reset)
timeout.kick()

# Resets the timeout with a new duration
timeout.reset(duration=1000)

Date and Time Helper Functions

These are helper functions that are not directly part of the timer classes showcased above. Since these functions are not intended for realtime applications, they are implemented entirely in Python.

Convert Time

This helper function performs time-conversions, rounding to 3 decimal places, and works with time-scales from nanoseconds to days.

from ataraxis_time import convert_time, TimeUnits

# The conversion works for Python and NumPy scalars. Use the TimeUnits enumeration to specify input and
# output units. By default, the method returns the converted data as NumPy 64-bit floating scalars.
initial_time = 12
time_in_seconds = convert_time(time=initial_time, from_units=TimeUnits.DAY, to_units=TimeUnits.SECOND)
print(f"12 days is {time_in_seconds} seconds.")

# It is possible to provide the units directly, instead of using the TimeUnits enumeration. Also,
# it is possible to instruct the function to return Python floats.
initial_time = 5
time_in_minutes = convert_time(time=initial_time, from_units="s", to_units="m", as_float=True)
print(f"5 seconds is {time_in_minutes} minutes.")

Rate and Interval Conversion

The rate_to_interval() and interval_to_rate() functions convert between frequencies (Hz) and time intervals.

from ataraxis_time import rate_to_interval, interval_to_rate, TimeUnits

# Converts a 30 Hz frequency to a microsecond interval
interval_us = rate_to_interval(rate=30, to_units=TimeUnits.MICROSECOND)
print(f"30 Hz = {interval_us} us interval")

# Converts a 1000 us interval back to Hz
rate_hz = interval_to_rate(interval=1000, from_units=TimeUnits.MICROSECOND)
print(f"1000 us = {rate_hz} Hz")

Timedelta Interoperability

The to_timedelta() and from_timedelta() functions convert between numeric time values and Python datetime.timedelta objects.

from ataraxis_time import to_timedelta, from_timedelta, TimeUnits

# Converts 500 milliseconds to a timedelta
td = to_timedelta(time=500, from_units=TimeUnits.MILLISECOND)
print(f"500 ms as timedelta: {td}")

# Converts a timedelta back to microseconds
us_value = from_timedelta(timedelta_value=td, to_units=TimeUnits.MICROSECOND)
print(f"Timedelta as microseconds: {us_value}")

Timestamps

Timestamp methods generate and work with microsecond-precise UTC timestamps. The generated timestamp can be returned as and freely converted between three supported formats: string, bytes array, and an integer number of microseconds elapsed since the UTC epoch onset. The precision parameter controls how much detail is included in the output.

from ataraxis_time import get_timestamp, convert_timestamp, TimestampFormats, TimestampPrecisions

# Gets the current date and time as a timestamp. The timestamp is precise up to microseconds by default.
# Use TimestampFormats to specify the desired format.
dt = get_timestamp(time_separator='-', output_format=TimestampFormats.STRING)
print(f"Current timestamp: {dt}.")

# Uses the precision parameter to control the detail level of the output.
dt_day = get_timestamp(output_format=TimestampFormats.STRING, precision=TimestampPrecisions.DAY)
print(f"Day-precision timestamp: {dt_day}.")

# The function also supports giving the timestamp as a serialized array of bytes. This is helpful when it is used as
# part of a serialized communication protocol.
bytes_dt = get_timestamp(output_format=TimestampFormats.BYTES)
print(f"Byte-serialized current timestamp value: {bytes_dt}.")

# Use the convert_timestamp() function to convert the timestamp to a different format. It supports cross-converting
# all timestamp formats stored in the TimestampFormats enumeration.
integer_dt = convert_timestamp(timestamp=bytes_dt, output_format=TimestampFormats.INTEGER)
string_dt = convert_timestamp(timestamp=integer_dt, output_format=TimestampFormats.STRING)
print(
    f"The timestamp can be read as a string: {string_dt}. It can also be read as the number of microseconds elapsed "
    f"since UTC epoch onset: {integer_dt}."
)

Parse Timestamp

The parse_timestamp() function parses arbitrary datetime strings using strptime-compatible format strings and returns them as timestamps in any supported format.

from ataraxis_time import parse_timestamp, TimestampFormats

# Parses a datetime string into a microsecond integer timestamp
us_timestamp = parse_timestamp(
    date_string="2024-03-15 14:30:00",
    format_string="%Y-%m-%d %H:%M:%S",
    output_format=TimestampFormats.INTEGER,
)
print(f"Parsed timestamp: {us_timestamp}")

# Parses into a string timestamp with day precision
day_timestamp = parse_timestamp(
    date_string="March 15, 2024",
    format_string="%B %d, %Y",
    output_format=TimestampFormats.STRING,
    precision="day",
)
print(f"Day-precision parsed timestamp: {day_timestamp}")

API Documentation

See the API documentation for the detailed description of the methods and classes exposed by components of this library. The documentation also covers the C++ source code and the axt-benchmark CLI command.


Developers

This section provides installation, dependency, and build-system instructions for the developers that want to modify the source code of this library.

Installing the Project

Note, this installation method requires mamba version 2.3.2 or above. Currently, all automation pipelines require that mamba is installed through the miniforge3 installer.

  1. Download this repository to the local machine using the preferred method, such as git-cloning.
  2. If the downloaded distribution is stored as a compressed archive, unpack it using the appropriate decompression tool.
  3. cd to the root directory of the prepared project distribution.
  4. Install the core development dependencies into the base mamba environment via the mamba install tox uv tox-uv command.
  5. Use the tox -e create command to create the project-specific development environment followed by tox -e install command to install the project into that environment as a library.

Additional Dependencies

In addition to installing the project and all user dependencies, install the following dependencies:

  1. Python distributions, one for each version supported by the developed project. Currently, this library supports the three latest stable versions. It is recommended to use a tool like pyenv to install and manage the required versions.
  2. Doxygen, to generate C++ code documentation.
  3. A C++ build toolchain and, for cross-architecture wheels, Docker, to build binary wheels via cibuildwheel. Testing cross-compiled wheels has per-platform prerequisites: on macOS, Rosetta 2 is required to test x86_64 wheels on Apple Silicon (install it with softwareupdate --install-rosetta --agree-to-license); on Linux, non-native architectures build and test inside Docker under QEMU emulation, registered once per machine with docker run --privileged --rm tonistiigi/binfmt --install all; on Windows, ARM64 wheels need the ARM64 MSVC runtime, installed through the Visual Studio Installer. Run python tools/check_build_env.py to verify these prerequisites before building.

Development Automation

This project uses tox for development automation. The following tox environments are available:

Environment Description
lint Runs ruff formatting, ruff linting, and mypy type checking
stubs Generates py.typed marker and .pyi stub files
{py312,...}-test Runs the test suite via pytest for each supported Python
coverage Aggregates test coverage into an HTML report
docs Builds the API documentation via Sphinx
build Builds sdist and wheel distributions
upload Uploads distributions to PyPI via twine
install Builds and installs the project into its mamba environment
uninstall Uninstalls the project from its mamba environment
create Creates the project's mamba development environment
remove Removes the project's mamba development environment
provision Recreates the mamba environment from scratch
export Exports the mamba environment as .yml and spec.txt files
import Creates or updates the mamba environment from a .yml file

Run any environment using tox -e ENVIRONMENT. For example, tox -e lint.

Note, all pull requests for this project have to successfully complete the tox task before being merged. To expedite the task's runtime, use the tox --parallel command to run some tasks in parallel.

AI-Assisted Development

Claude Code skills and other AI development assets for this project are distributed through the ataraxis marketplace as part of the automation plugin. Install the plugin from the marketplace to make all associated skills and development tools available to compatible AI coding agents.

Automation Troubleshooting

Many packages used in tox automation pipelines (uv, mypy, ruff) and tox itself may experience runtime failures. In most cases, this is related to their caching behavior. If an unintelligible error is encountered with any of the automation components, deleting the corresponding cache directories (.tox, .ruff_cache, .mypy_cache, etc.) manually or via a CLI command typically resolves the issue.


Versioning

This project uses semantic versioning. See the tags on this repository for the available project releases.


Authors


License

This project is licensed under the Apache 2.0 License: see the LICENSE file for details.


Acknowledgments

  • All Sun lab members for providing the inspiration and comments during the development of this library.
  • elapsedMillis project for providing the inspiration for the API and the functionality of the timer class.
  • nanobind project for providing a fast and convenient way of binding C++ code to Python projects.
  • The creators of all other dependencies and projects listed in the pyproject.toml file.

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

ataraxis_time-6.0.2.tar.gz (66.5 kB view details)

Uploaded Source

Built Distributions

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

ataraxis_time-6.0.2-cp314-cp314-win_arm64.whl (440.6 kB view details)

Uploaded CPython 3.14Windows ARM64

ataraxis_time-6.0.2-cp314-cp314-win_amd64.whl (282.9 kB view details)

Uploaded CPython 3.14Windows x86-64

ataraxis_time-6.0.2-cp314-cp314-win32.whl (263.5 kB view details)

Uploaded CPython 3.14Windows x86

ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl (537.8 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_i686.whl (584.3 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ i686

ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl (517.0 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (79.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ataraxis_time-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl (80.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

ataraxis_time-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (75.8 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

ataraxis_time-6.0.2-cp314-cp314-macosx_15_0_x86_64.whl (73.0 kB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

ataraxis_time-6.0.2-cp314-cp314-macosx_15_0_arm64.whl (64.2 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

ataraxis_time-6.0.2-cp313-cp313-win_arm64.whl (426.6 kB view details)

Uploaded CPython 3.13Windows ARM64

ataraxis_time-6.0.2-cp313-cp313-win_amd64.whl (274.8 kB view details)

Uploaded CPython 3.13Windows x86-64

ataraxis_time-6.0.2-cp313-cp313-win32.whl (256.8 kB view details)

Uploaded CPython 3.13Windows x86

ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl (537.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_i686.whl (584.0 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl (517.0 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (79.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ataraxis_time-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl (79.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

ataraxis_time-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (75.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

ataraxis_time-6.0.2-cp313-cp313-macosx_15_0_x86_64.whl (73.0 kB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

ataraxis_time-6.0.2-cp313-cp313-macosx_15_0_arm64.whl (64.2 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

ataraxis_time-6.0.2-cp312-cp312-win_arm64.whl (426.6 kB view details)

Uploaded CPython 3.12Windows ARM64

ataraxis_time-6.0.2-cp312-cp312-win_amd64.whl (274.8 kB view details)

Uploaded CPython 3.12Windows x86-64

ataraxis_time-6.0.2-cp312-cp312-win32.whl (256.8 kB view details)

Uploaded CPython 3.12Windows x86

ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl (537.9 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_i686.whl (584.1 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl (517.2 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

ataraxis_time-6.0.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (79.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ataraxis_time-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl (80.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

ataraxis_time-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (75.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

ataraxis_time-6.0.2-cp312-cp312-macosx_15_0_x86_64.whl (73.1 kB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

ataraxis_time-6.0.2-cp312-cp312-macosx_15_0_arm64.whl (64.3 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

File details

Details for the file ataraxis_time-6.0.2.tar.gz.

File metadata

  • Download URL: ataraxis_time-6.0.2.tar.gz
  • Upload date:
  • Size: 66.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for ataraxis_time-6.0.2.tar.gz
Algorithm Hash digest
SHA256 f30289f9f0284853988109161431e1d49a0a8ea95fbdab02d4baa11999ee78ab
MD5 8fcacb6873849ecd08242bf332fc825a
BLAKE2b-256 779302a25791d85f10833a5fd112b6cb31b67109ee4801c10f407560da7752f0

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 a12b1b79fae2edbe2ccc24d876b8ad7afb65d355f7154a06b0a41faba556218a
MD5 399635058ab2660146ab076305556e45
BLAKE2b-256 60c1a68bb65957125563665aa770ef3eca83bfdc221f672b7213b2c58c6d5df8

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 8d8f71f9bcca889e18f6556f127f6bd68df0adf84b18cf0c56178b55d4936a39
MD5 56e1586650d25c7496dc9bdff05d0fd1
BLAKE2b-256 6ce2f592709a9b7df41bb09b6d4a4bd406d5ad05f78fe45a9d8c90f6dc22c496

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-win32.whl.

File metadata

  • Download URL: ataraxis_time-6.0.2-cp314-cp314-win32.whl
  • Upload date:
  • Size: 263.5 kB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 051ee50382477f6fe9112c6e2c9be022ae8b8d80acf24e07db5db63ca72c72c7
MD5 a094a33c16be12ce72c582474186e433
BLAKE2b-256 ed1eb7bd03af49d299483d409e4f4e7c60d3f2374b7bb0622f0246bd2353bfa0

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bf9f24000260435833068df44e72421448c1a904a2d533488617f88e1d26276f
MD5 50156cda8d40d441a8ab87f3d37b736c
BLAKE2b-256 e8dcfc71af11a23f66aaeaba3db6b15e90f7021449dbb1e912b7f7230081e131

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 7c1f25a1363c379ec8908e96bbdc7cac784bdce260d7a29fe34e7d60b9b32e23
MD5 04790f1d871d3437e7814c5cae26fa57
BLAKE2b-256 df629b36ac9b85b0782bec2ed8f91c98af7300c2038d4c328c88815f9e148c68

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0e530c7132be499178e94960b55271e27c5034585507c2c4d753f6f534a50b5e
MD5 d8d456165a9a7c66add2bea0ea13628b
BLAKE2b-256 81b9ea88cc6646a5075256e04f7c9042e2a8712a6de13553686fca408befb41b

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e21bd16b7d7853311dafb35b2764d2fff6c26fe4504c15a1118cac507f480134
MD5 c23829aee7d059183b924da6ee0fe10e
BLAKE2b-256 383c9ed569961595782c2efcc7e1aade0c379fe5af752b0408f3df3fc3a97298

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 c906d20556ea3421552c1b14cabc93bf04a1a58bf55ea5e73a01ce85bf013788
MD5 7e19920516f57c48964400b1bf427a04
BLAKE2b-256 800d9f8cf3a39992239f28263909734bbf74aa7d86e6835722e4ddcfeb68f596

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 00b1b810dffc15b412ca7cd5e9080ac53af3fa4fb713ed21123c1a84592b946c
MD5 927a51497249bbcfb4daaf499ce2a1ac
BLAKE2b-256 88770f4db06eea404723f77de7a57a90448e4d016c157c252c0b4484f9d07862

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 524a30b1dcbbd3382ee97aaa64541173ad18725614965d4f8d3aaff6fe2e2fa8
MD5 955aa42598c0f36d177a87c61434d8cc
BLAKE2b-256 6e64aabc51d9bae2b4793759c91c39cf7b6050da9462c91ce453983679b16d5e

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 5a4f9ad82c2ec6013de58fa81938327f2cc00e2ce478ab8aa79dd0fc472520c4
MD5 d44a0e8331a952e0122c5f173c4b5641
BLAKE2b-256 c2fccd3bae81dc25cd0506d35cec176022378daeec6bc4a6acd511b4038d8575

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 e5cadcfbb0a4b874ec328ffcbfd96e836daec1f45e65fd2bf220cd2e882a6f75
MD5 6397ccc90fba2c8ae5724ce79d4f88d4
BLAKE2b-256 c7a0ef2e962f0d3909f91831f893c6d948e49a38a9d009d473b967cc704c548b

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1a3c23480e7015a8e354742b063b25637be7da6b2dd08c2474ee4324d71908d7
MD5 60b4838a8d4f935d882d57b32b6ffa9a
BLAKE2b-256 63ce274bee3dc0bcfbb5485c851cd8ae05375b7c2ce103079f0890b31edec117

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-win32.whl.

File metadata

  • Download URL: ataraxis_time-6.0.2-cp313-cp313-win32.whl
  • Upload date:
  • Size: 256.8 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 2b302c45f0023c001a4fb75a632d565cd0d1262ac4ea1b7383b97dd21d1e0a79
MD5 d1dd68b52d8c63cd0f3f2871e7995035
BLAKE2b-256 bb1f2f855fb74b2c99e665da18d6437a51d734e6e679374d414e04faf1728c44

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2d996be238f24dfdc77964b28748fe012c47e4188c40e337244429ad50f57917
MD5 8a61e1495a582aab70bd798ca753365e
BLAKE2b-256 b05efd6b9d12000ffa67436481461affeb2cbaa6b4a4f0c2f5456a7ec73702eb

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 295d564b659c2c1419fff61ddcc3ffa19e2e1fb7fb39b92b04b5e4a137929e8b
MD5 5211df6bd28fc6967e9002750fff6af4
BLAKE2b-256 a461f5ea6cd684a7ed65ffd4eb430bbb500c54a34eaa21d6c93e11fe091a0abd

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9ca7b448fb47dfe1e15ffc559a7dd192f32a52845b2c029b951dd896c2e44b9c
MD5 c61c5255906edb35eb41d5f99c92392a
BLAKE2b-256 cac233f10c0d7ea85b759f17ab8a688bdfaafea6f16629e553b6aa43ba5a2bf9

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 62f743a12bce5b392594d1bf1ee745115735a5106dd426f06f0539bc0c2e8815
MD5 d78f65f3e4ca2e54647a665c778edd68
BLAKE2b-256 9c17311784ba382e8bf1fb3caf39aea749cae254e17e9bfb87679d5a6d0d7ff7

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 d299a9f5692c3e0496904bbc91976f0afaa1016dee2cf9eb194eebd8dda6df07
MD5 6291032669f012e7105679ce42bb2521
BLAKE2b-256 9d4c9bc32def37c7fe877752e91c0cdd436198109e312a1122329cfea16b4d54

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9eabb6460b1e83f45a98d4f708d7fde888802df92be808caa7020fecd9494229
MD5 0d05a3bfcd50333efc5842aa5f395c22
BLAKE2b-256 b7b3a8d7a5a47247ca00dd21576c94e335dae5b4257dfa4f5b9fd58b3eb39c7d

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 a61b9984eb2f3d06ad7643e01a6141db594fb4c52f231864fbc4be7a599f2c26
MD5 d1426ee2e3ab6312f094e6f4f413daef
BLAKE2b-256 ebf6bc82bb032a55830d12f84e2309b1bb45410098bd7a488865d7d58f793e00

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 aeb63bd454f69eb5d3f1fed77ebab0ebbaebca67c18814cba048514eb5d7f65f
MD5 d754f7ac360e37d31c8ac58375eefae0
BLAKE2b-256 d96a41506dc7b0b28595230932dea8bfab0d62c458272a986847f81fe34902d4

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-win_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 542790e2e6292444f9bded81c82c1d45dbede6cb07f8d07b865d8445f8b6d63b
MD5 97368b67fd677744c8f22cfb638cab25
BLAKE2b-256 e25e2e318e20ddb47ff9431f76637450956aa6dfad32eb06e6f48a6493b4ab90

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 348991bed568fd4d3ae67ada3851c7370ebd2ee7b76a7e159277015078f97c92
MD5 c8e0c58ebc2914f63c01756c8b19d7d0
BLAKE2b-256 48bb0f0944a2f18e991b06bf1a8881f0eb1055e973938349682b67b11d15844b

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-win32.whl.

File metadata

  • Download URL: ataraxis_time-6.0.2-cp312-cp312-win32.whl
  • Upload date:
  • Size: 256.8 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 94aefa1210a85c155496ca4f3194290902b3478ef6daaba84ec78eaafbbbd81f
MD5 9e3e7a5f77c59a04aeb917daaa89a794
BLAKE2b-256 ced6d207104acddce668556e2b9ab6ffe3803fe59a618f414de571a9651e292e

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a5d03f93613e3d2965b45ca15fd7b331ecb0461a8be3557eb35c85f307d3d37a
MD5 420e5161c2e90bf4fb2ee1b9793bceb2
BLAKE2b-256 a3b1e09ede02737b6a06522e6b7051c53f2163cba5744cdec01affeaba5672df

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 2726469dc5d982006baf08a40c12af4e4c209e53ab3856f4fd85d9981fdafd9c
MD5 ce07772a689656334fb781cddbd3a0ed
BLAKE2b-256 14ff22ba125c9653159ffcb1fa738b92167c0572a6ecc6f25b814ee5b01fca91

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ad01f423cd8d499a63ba0a282bbcb3477dc24ff05ce5392ebc7951c2b87129db
MD5 c0106394d381fb483c07703ce522458d
BLAKE2b-256 73548f062986e3bd80772ef55fe6639e80f5f69fd6ff90520b5eb689b5d17b30

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c472f34f0eb5f925b4b208558f5a7cd6cc4c32fe7fa2deb6bf7dba397e8b4cde
MD5 33f3f6255cdfa9055fb62b6cd04edd6e
BLAKE2b-256 152c69533c05f3bee3b839c30dc801809980e5181eaff9c02d43c7de0673fcf5

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 52a4b8e89b189dc73a5a8ec83c8cce43e48a4871b34c12384e56a54a6c929b2a
MD5 5c8a08ae424f867f591aa37b98b6506c
BLAKE2b-256 8f7b7006ee3ab1f3a531884598b2dcd6db043f286fc9ed20856f85d952298ebc

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6a190eab63aeaa8b5cfa9e10ff4e728421f47ce070a250630d864c2568f25c9b
MD5 0e692f83d916b63df516842208247aa0
BLAKE2b-256 13a430d49eb64bcb6906ccfd8e6ea501aeb587dbed7b84e9d4855ccb5dbfeea5

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 1dda59732d16205363ee38651b79bb4062a9df938861a5c954593419178bcaa8
MD5 01309b6cd2e368d2630c8e76c77a89a0
BLAKE2b-256 33506c625e3e984563b298568d8be354bcc2a2076fa2bbaf6b0a2470e0f79fd1

See more details on using hashes here.

File details

Details for the file ataraxis_time-6.0.2-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for ataraxis_time-6.0.2-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3bd0378034a4b74ecb12e6aed7fa22a3af741ac07361ec76338f98d93d2fe980
MD5 7bf87f3396e0967f61d6253c9e7c52bb
BLAKE2b-256 53ff1b7e2a2628aae9d8673fef20c8bb733f5357ea7a525e3a8a5c394118d009

See more details on using hashes here.

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