Skip to main content

General purpose library

Project description

PyPI - Downloads

PyPI - Version PyPI - Python Version PyPI - Implementation PyPI - Format

Static Badge Static Badge

GitHub tag (with filter) PyPI - Status GitHub License

cengal_light

This package contains compiled extensions, providing enhanced performance, while omitting mandatory dependency installations.

In order to install Cengal with all requirements execute either:

  • pip install cengal_light[full] - will install Cengal as well as most of requirements
  • pip install cengal - Recommended - will install cengal_light[full] as well as some missed requirements

Cengal

Cengal is a versatile Python library designed for a wide range of applications. To enhance performance, certain modules within Cengal have been implemented using Cython and/or C.

API Design Approach

The Cengal library adheres to an API design approach used in frameworks such as Qt. For those familiar with the C++ language, I will draw comparisons between the approaches of Qt and the C++ Standard Template Library (STL). The API provided by the STL was designed to significantly reduce the burden on programmers who develop the STL. This decision was logical from the standpoint of marketing the STL among compiler creators. However, this led to the usability of the STL for the user not being great. This is evident in the fact that the STL provides the most minimal possible API, and any conveniences must be programmed anew by each programmer every time - constantly reinventing the wheel. In contrast, Qt uses the opposite approach to API construction: classes have many methods whose purposes are similar, but are aimed at different usage models. This simplifies the use of Qt for users, speeds up the writing of the final code, and avoids many errors that we usually make when we write our own 'bicycles' for the same actions each time (not because the we are not smart, but because we are humans and therefore prone to make mistakes from time to time).

Cengal compatibility and requirements

  • Target platforms: Win32, Linux, OS X, Android, iOS, Emscripten
  • Target architectures: x64, x86, ARM
  • Target interpreters: CPython, PyPy
  • Recommended Python versions: 3.8+

Installation

To get started with Cengal, you can easily install it along with all the mandatory dependencies by running pip install cengal. This command not only installs Cengal and its required dependencies but also takes care of fetching and installing prebuilt wheels tailored for the Cengal library. These wheels are compatible with both Windows and Linux systems and work seamlessly with both CPython and PyPy interpreters.

If you prefer to install Cengal without its dependencies, you can opt for the 'cengal-light' package, which serves as the backend for the 'cengal' package. Simply run pip install cengal-light to get the lightweight version of Cengal.

Documentation

Cengal Documentation

For example Cengal Coroutines Concepts & Usage

or partially:

Cengal Wiki

For example Wiki: Cengal Coroutines Concepts & Usage

Stand-Alone Packages for Specific Cengal Modules

To cater to varying needs and streamline the installation process, I've introduced stand-alone packages for select Cengal modules. These packages are designed to offer users the ability to install specific Cengal functionality without the burden of the library's full set of dependencies.

The core of this approach lies in our 'cengal-light' package, which houses both Python and compiled Cengal modules. The 'cengal' package itself serves as a lightweight shell, devoid of its own modules, but dependent on 'cengal-light[full]' for a complete Cengal library installation with all required dependencies.

For users seeking individual Cengal features or looking to minimize dependencies, our stand-alone packages provide a convenient solution. Each stand-alone package is dedicated to a specific Cengal module and relies on 'cengal-light' as its sole dependency.

Below, you'll find a list of these stand-alone packages, each corresponding to a distinct Cengal module:

  • cengal_memory_barriers (package for cengal.hardware.memory.barriers module): Fast crossplatform memory barriers for Python.
  • cengal_cpu_info (package for cengal.hardware.info.cpu module): Extended, cached CPU info with consistent output format.
  • cengal_app_dir_path_finder (package for cengal.file_system.app_fs_structure.app_dir_path module): Offering a unified API for easy retrieval of OS-specific application directories, enhancing data management across Windows, Linux, and macOS.

Stay tuned for future additions to our collection of stand-alone packages!

Exclusive Features: No Alternatives Online

Build system (work in progress)

Automatic hackable build system for your package which supports Python modules made with different languages: Cython (including Python to Cython automatic compilation), C/C++, ObjectiveC, Go, Nim. Other languages support is in progress.

Compiles your code, gather binary artifacts and puts them into your wheel.

Examples

Concurrent Execution of blocking CPU-Bound and GUI Tasks on a Single Thread

Cengal offers a unique and powerful feature that allows you to execute a diverse set of tasks concurrently on a single thread, effectively managing CPU-bound and GUI-related operations without introducing the complexity of multithreading or multiprocessing. Notably, Cengal can convert blocking CPU-bound functions into proper asynchronous coroutines, preventing them from blocking the thread for extended periods.

Examples

In this example, an application concurrently (at the same time) executes all of the following components within a single thread:

  • own blocking CPU-bound function
  • third-party blocking CPU-bound function
  • Tkinter application
  • CustomTkinter application
  • asyncio-based file reading task.

YouTube Showcase

Watch the video

Source code

Tutorial

True Interprocess Shared Memory (Proof of Concept)

Cengal introduces a novel approach to interprocess shared memory, currently at the proof of concept stage. With this feature, you can seamlessly share data between your Python processes (currently limited to 2 processes) and work with them just as you would in a single process. The underlying mechanism optimizes cross-process communication by employing efficient memory barriers instead of resource-intensive system calls.

Supported data types (current stage):

  • list: Unlike multiprocessing.shared_memory.ShareableList, Cengal's shared lists are both mutable and resizable between different processes. They support various container types (lists, tuples, dicts) as items and implement all standard list methods. Plus, they offer superior performance compared to multiprocessing.shared_memory.ShareableList.
  • dict: Currently immutable.
  • tuple
  • str
  • bytes
  • bytearray
  • bool
  • float: Cengal's shared float values support Addition Assignment (shared_list[20] += 999.3) and all other native methods and operators, unlike values in multiprocessing.shared_memory.ShareableList.
  • int: Currently limited to int64. Similar to shared float values, Cengal's shared integers support Addition Assignment (shared_list[15] += 999) and all other native methods and operators.
  • None

Examples

shared_memory_example.py

and smaller:

from multiprocessing import Process
from cengal.hardware.memory.shared_memory import *


shared_memory_name = 'test_shared_mem'
shared_memory_size = 200 * 1024 * 1024
switches = 1000
changes_per_switch = 2000


def work(manager, shared_data)
    index = 0
    while index < switches:
        with wait_my_turn(manager):
            # emulatin our working process
            for i in range(changes_per_switch):
                shared_data[1] += 1

def second_process():
    consumer: SharedMemory = SharedMemory('test_shmem', False)
    consumer.wait_for_messages()
    with wait_my_turn(consumer):
        shared_data = consumer.take_message()
    
    work(consumer, shared_data)


creator: SharedMemory = SharedMemory(shared_memory_name, True, shared_memory_size)
p = Process(target=second_process)
p.start()
creator.wait_consumer_ready()
with wait_my_turn(creator):
    data = [
        'hello',
        0,
        (8, 2.0, False),
        {
            b'world': -6,
            5: 4
        }
    ]
    shared_data = creator.put_message(data)

work(creator, shared_data)
p.join()

Performance Benchmark results

In the realm of performance, Cengal's shared list container, although not yet fully optimized, is already outpacing the performance of multiprocessing.shared_memory.ShareableList. What sets it apart is its comprehensive support for native methods and operators, including Addition Assignment (shared_list[15] += 999), a feature unavailable in multiprocessing.shared_memory.ShareableList.

Cengal's shared list container demonstrates remarkable speed, boasting the ability to handle over 30,000,000 reads/writes per second for an int64 value (shared_list[2] = 1234 / val = shared_list[7]), or more than 1,450,000 addition assignments per second (shared_list[15] += 999). These performance figures underscore the efficiency and versatility of Cengal's interprocess shared memory solution, even in its current state.

Benchmark Results

Roadmap

  • Continuosly moving more logic to Cython
  • Implement mutable dict and set using an appropricate C hashmap library or C++ code (depending what will be faster in our case)
  • Increase number of interacting processes from 2 to variable value
  • Implement garbage collector for shared data in addition to manual free() call
  • Implement an appropriate Service for cengal.parallel_execution.coroutines - for comfortable shared memory usage inside an async code (including asyncio)
  • Improve memory allocation algorithm in an attempt of making it faster

Async LMDB database API

An example of usage (unit test of the module):

Async logging into LMDB database

Developer can observe their logs in runtime using cengal.parallel_execution.coroutines.coro_tools.loop_administration.admin_tk module (made with Async Tkinter GUI):

An example of usage of the admin_tk:

Alternatively, developer can load logs in off-line mode using Log Viewer application (made with async Tkinter GUI):

Async Tkinter and Customtkinter

Async wxPython

Async QT (PySide, PySide2, PySide6, PyQt4, PyQt5, PyQt6)

Async PyTermGUI

Transparent background for your desktop applications (TBA)

  • Target OS: Windows 11, Windows 10, Windows 8, Windows 7, Windows Vista.
  • Target frameworks: PySide, PyQt, Kivy, PyWebView

title , title

Tkinter True Borderless apps for Windows platform (TBA)

  • Target OS: Windows 11, Windows 10, Windows 8, Windows 7, Windows Vista.
  • Target frameworks: CustomTkinter, Tkinter, ttkbootstrap, ...

title

Cengal Coroutines and Asyncio Administration and Monitoring Page

Observe loop performance, services state and coroutines list with details. Use an async interactive console in order to interact with your application from inside.

YouTube Showcase

Watch the video

Examples

admin_test.py

Modules with unique functionality

  • "parallel_execution"
    • "coroutines" - asynchronous loop with almost preemptive multitasking within the single thread. Brings an async approach to an unmodified Tkinter, Qt, Kivy, etc. Unlike asyncio/trio/curio, it uses microkernel (services-based) approach which makes it highly- and easily-expandable. Can be executed both independently (asyncio/uvloop loop will be injected within the Cengal-coroutine when needed) and within already executed asyncio/uvloop loop. Can be used from the PyScript for the Web app creation.
      • "coro_standard_services" - set of standard services. You can replace standard service by yours for your app or for third-party module without code changes: by registering your own alias.
        • "loop_yield" - automatically kinda yield from your loops from time to time (priority based). Can be used to make a proper coroutine (which will not hangs on its endless loops) even from the long-running CPU-hungry third-party function (by function's bytecode modification made in runtime).
        • "tkinter" - make your Tkninter app async easily. Run any number of asynchronous Tkinter apps in single thread.
        • "db" - async wrapper around LMDB which provides an appropriate async API
        • "asyncio_loop" - use asyncio-based code directly from your async Cengal-coroutine neither Trio nor Curio able to to do this
        • "wait_coro" - 'put_atomic' request is an analogue of Trio's Nurseries for list of one or more coroutines; 'put_fastest' - returns when at least N of coroutines from the list were done successfully; etc.
        • "read_write_locker" - sync primitive usefull for DB creation (was made for a TagDB)
        • "remote_nodes" - in progress - connect to any opened listener/port of the node (TCP/UDP/Unix_Socket - doesn't matter), and identify your receiver by name (defined once - during the connection creation process). Uses improved version of the asyncio.streams as a backend in order to have a back pressure and an improved performance (see "efficient_streams" module description below).
      • "coro_tools" - tools
        • "await_coro" - await Cengal-coroutine or await for a call to the Cengal-service from your asyncio code
        • "low_latency" - use standard json module from your coroutines without hangs on huge Json-data (which usually hung even fast json implementation like orjson)
      • "integrations" -
        • "Qt" - wrapper around an unmodified Qt (supports: PySide, PySide2, PySide6, PyQt4, PyQt5, PyQt6). Adds asynchronous behavior to Slots. Doesn't require total reimplementation of your Qt app unlike other suggestions and competitors.
        • "customtkinter" - wrapper around an unmodified customtkinter. Implements an additional call, Customtkinter async apps needs to be executed for a proper work
        • "nicegui" - wrapper around an unmodified NiceGUI. Execute nicegui instance from within your code (administrative page for example). Build your pages in an asynchronous way in order to improve your server latency (NiceGUI makes it in a sync way).
        • "uvicorn" - wrapper around an unmodified uvicorn. Run uvicorn as a usual asyncio coroutine.
        • "uvloop" - an easy-install for a uvloop (if awailable).
        • "PyTermGUI" - wrapper around an unmodified PyTermGUI. Adds asynchronous behavior. No competitors currently.
    • "asyncio" - tools for an asyncio
      • "efficient_streams" - more efficient remake of an asyncion.streams. Better awailable traffic limits utilisation. Less kerner-calls number. Back pressure. Unlike asyncio, UDP version is planned but is not ready yet.
  • "code_flow_control" -
    • "python_bytecode_manipulator" - modify your or third-party Python function's code in runtime easily
    • "chained_flow" - easy to use monad. Execute your your code if all/none/some of steps were completed withot an exceptions. Use all/none/some resutls of your steps at the final part of monad execution.
    • "multiinterface_essence" - Make your model and add different interfaces to it easily. Can be used for example in games: create "chair", "ball", "person" models and add to them your library of general interfaces like "touch", "push", "sit", "shot", "burn", "wet", etc.
  • "hardware" - hardware related
    • "memory" - RAM related
      • "barriers" - fast full memory barriers for both x86/x64 and ARM (Windows, Linux, OS X, iOS, Android).
  • "time_management" -
    • "high_precision_sync_sleep" - provides an ability to put your thread into legetimate sleep for at least 10x smaller time period than time.sleep() from the Python's Standard Library able to do on same Operating System: uses nanosleep() on Linux and periodic SwitchToThread() on Windows.
    • "cpu_clock_cycles" - Returnes value of RDTSCP on x86/x86_64 or CNTVCT_EL0 on ARM. Fast implementation: 6-12 times faster than all other competitors on Github. Note: CPU Time Stamp Counter (TSC) is not depends on actual current CPU frequency in modern CPUs (starting from around year 2007) so can be safely used as a high precision clock (see time_management.cpu_clock module). Windows, Linux and other Operating Systems are using it internaly.
    • "cpu_clock" - like perf_counter() but 25% faster. Supports both x86/x86_64 and ARM. cpu_clock is slightly faster than cpu_clock_cycles because double (float in Python terms) transfered from C-code to Python code more efficiently than 64-bit int (which needs an addition internal logic inside the Python itself for conversion). Highest-precision possible since it is CPU Time Stamp Counter based which is not depends on actual current CPU frequency in modern CPUs (starting from around year 2007) so can be safely used as a high precision clock (and Windows, Linux and other Operating Systems are using it internaly in this way). Benchmark: cpu_clock_test.py

Some Other modules

  • "parallel_execution"
    • "coroutines" -
      • "coro_tools" - tools
        • "wait_coro" - decorate your coroutine in order to be able to execute it from the plain sunc code as a sync function
        • "run_in_loop" - serves the same purpose as an asyncio.run() call
        • "prepare_loop" - creates and returns loop. You may use it later
    • "asyncio" - tools for an asyncio
      • "run_loop" - similar to asyncio.run() but ends only when all background tasks will be finished (main coro can be finished long before this moment).
      • "timed_yield" - simple (dum-dum but faster) version of the "loop_yield" (see above) but made directly for an asyncio.
  • "bulk_pip_actions" - install lists of required modules. Lists can be different for a different operating systems
  • "code_inspection" -
    • "auto_line_tracer" - smart and easy to use line logger (current func name, file, lines numbers, surrounding code)
    • "line_tracer" - - easy to use line logger (current func name, file, line number)
    • "line_profiling" - confinient work with a line_profiler if awailable
  • "data_containers" - usefull data containers like stack, fast fifo, etc. Some of them are highly optimized for speed
  • "data_manipulation" -
    • "conversion" -
      • "bit_cast_like" - similar to std::bit_cast from C++
      • "reinterpret_cast" - similar to reinterpret_cast from C++. You have a third-party object and you want to change its type (and behavior) in runtime.
    • "serialization" - automatically choose a fastest appropriate serializer for your type and structure of data (json, simplejson, ujson, ojson, msgpack, cbor, cbor2, marshal, pickle, cloudpickle, ...)
    • "tree_traversal" - both recrsive and nonrecursive tree traversal algorithms
  • "ctypes_tools" - ctypes code and structures used by Cengal.
    • "tools" - ctypes tools usefull for your code
  • "file_system" - normalized relative path, etc.
    • "app_fs_structure" - unified list of the default app directories (data, cache, temp, etc.) recommended by OS (Linux, Windows, Mac OS X) in a runtime for a given application name or a service name. Results are cached. Cache size can be modified in runtime.
  • "hardware" - hardware related
    • "info" - hardware info
      • "cpu" - normalized results from cpuinfo extended with an info from psutil.
  • "introspection" -
    • "inspect" - find out function parameters, entity owners list (method -> subclass -> class -> module), entitie's own properties (excluding parent's properties), etc.
    • "third_party" -
      • "ctypes" - provice an instance of ctypes Structure and take a dict with all internals of this structure. Good for inspecting/logging/printing values of a given structure with all values of all its substructures.
  • "io" -
    • "used_ports" - database of known TCP/UDP ports. Updates from an appropriate Wikipedia page once per Cengal release but you can update if for your self anytime if you want to.
    • "serve_free_ports" - provide ports range with an interested port types set and receive number of the first open appropriate port on your machine within given port range.
    • "named_connections_manager" - base for the "remote_nodes" (see above) and similar entities
    • "net_io" - an experimental networking library with an expandable architecture. Has implemented modules for epoll and select.
  • "math" -
    • "algebra" -
      • "fast_algorithms" - Fast inverse square root (the one from Quake III) implemented efficiently
    • "geometry" -
      • "ellipse" - ellipse related. Also several algorithms for precisely or efficiently compute an ellipse perimeter
      • "point" - numpy (if awailable) or python implementation of points (1D, 2D, 3D, nD)
      • "vector" - numpy (if awailable) or python algotithms on vectors (1D, 2D, 3D, nD). Implements CoordinateVectorNd, VectorNd, DirectedGraphNd
  • "modules_management" - reload module, import drop-in-replacement module if an original is not awailable
  • "statistics" -
    • "normal_distribution" - compute the normal distribution of your data. Booth count or use a formula. 99, 95, 68; standard_deviation: diff_mean, sqrt(variance), max_deviation, min_deviation.
  • "text_processing" - text parsing, patching, detect BOM and encoding
  • "time_management" -
    • "timer" - timer for any synchronous code
    • "sleep_tools" - sleep for a production code. Using usual sleep you may get not wat you want if you are not really into your target OS internals (Windows/Linux)
    • "repeat_for_a_time" - measures code/function executions per second. But it smart and eficiently repeats target code/function not N times but up to a T seconds. Results to a high precision measurements for even smallest and fastest pieces of code.
    • "relative_time" - time related module for a business purposes (calendars, payments, etc.)
  • "unittest" -
    • "patcher" - set of context manager for monkey patching builtins or other entities
  • "user_interface" -
    • "gui" -
      • "nt" -
        • "blur_behind" - Turn on Aero Glass backgrownd in Winndows 7, 10, 11 using documented or undocumented API (which one is awailable)
        • "dpi_awareness" - Turn on DPI awareness
  • "web_tools" -
    • "detect_browsers_host_device_type" -
      • "by_http_user_agent" - detects is it mobile or tablet device by analizing its http user_agent string

Size of the Cengal library

At the moment of 19 Mar 2024:

Around 200 modules

-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python                         751          23696          30083          77396
Cython                          10            727            472           1892
C                                2             39             26            163
C/C++ Header                     2             14             26             37
Go                               3             19             37             88
Nim                              2             14              6             36
-------------------------------------------------------------------------------
SUM:                           770          24509          30650          79612
-------------------------------------------------------------------------------

Counted with cloc util.

Examples

  • Can be found in examples dir
  • Each module has a development folder. Examples are usually placed there
  • Some of old examples can be fined inside the tests dir.

Cengal.coroutines examples

Text processing example

Ensures and updates copyright (with dates) in each Cengal's source file

Manual Build

pip install git+https://github.com/FI-Mihej/Cengal.git

Installation process requires compilation. So ensure that:

  • GCC/Clang is installed in your Linux/WSL (sudo apt-get --yes install build-essential for Ubuntu. And ./before_install_on_wsl.sh for Ubuntu under WSL for UI like Tkinter or Qt if you are using some kind of XServer on your host Windows)
  • At least Visual Studio Community - Build Tools are installed on your Windows and you are installing Cengal from within its Developer Command Prompt for an appropriate target CPU architecture (x64 Native Tools Command Prompt for VS 2022 for example). Make sure that you have compatible version of Visual Studio for your target CPython interpreter (see python -VV command output. For example Python 3.9.11 (tags/v3.9.11:2de452f, Mar 16 2022, 14:33:45) [MSC v.1929 64 bit (AMD64)]: this python interpreter requires Visual Studio 2019 version 16.11.2+ according to 1929 word search in Wikipedia page)

Projects using Cengal

  • flet_async - wrapper which makes Flet async and brings booth Cengal.coroutines and asyncio to Flet (Flutter based UI)
  • justpy_containers - wrapper around JustPy in order to bring more security and more production-needed features to JustPy (VueJS based UI)
  • Bensbach - decompiler from Unreal Engine 3 bytecode to a Lisp-like script and compiler back to Unreal Engine 3 bytecode. Made for a game modding purposes
  • Realistic-Damage-Model-mod-for-Long-War - Mod for both the original XCOM:EW and the mod Long War. Was made with a Bensbach, which was made with Cengal
  • SmartCATaloguer.com - TagDB based catalog of images (tags), music albums (genre tags) and apps (categories)

License

Copyright © 2012-2024 ButenkoMS. All rights reserved.

Licensed under the Apache License, Version 2.0.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

cengal_light-4.2.0-pp310-pypy310_pp73-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded PyPy macOS 14.0+ ARM64

cengal_light-4.2.0-pp310-pypy310_pp73-macosx_13_0_x86_64.whl (3.0 MB view details)

Uploaded PyPy macOS 13.0+ x86-64

cengal_light-4.2.0-pp39-pypy39_pp73-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded PyPy macOS 14.0+ ARM64

cengal_light-4.2.0-pp39-pypy39_pp73-macosx_13_0_x86_64.whl (3.0 MB view details)

Uploaded PyPy macOS 13.0+ x86-64

cengal_light-4.2.0-pp38-pypy38_pp73-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded PyPy macOS 14.0+ ARM64

cengal_light-4.2.0-pp38-pypy38_pp73-macosx_13_0_x86_64.whl (3.0 MB view details)

Uploaded PyPy macOS 13.0+ x86-64

cengal_light-4.2.0-cp313-cp313-macosx_14_0_arm64.whl (8.1 MB view details)

Uploaded CPython 3.13 macOS 14.0+ ARM64

cengal_light-4.2.0-cp313-cp313-macosx_13_0_x86_64.whl (8.2 MB view details)

Uploaded CPython 3.13 macOS 13.0+ x86-64

cengal_light-4.2.0-cp312-cp312-macosx_14_0_arm64.whl (8.6 MB view details)

Uploaded CPython 3.12 macOS 14.0+ ARM64

cengal_light-4.2.0-cp312-cp312-macosx_13_0_x86_64.whl (8.7 MB view details)

Uploaded CPython 3.12 macOS 13.0+ x86-64

cengal_light-4.2.0-cp311-cp311-macosx_14_0_arm64.whl (8.4 MB view details)

Uploaded CPython 3.11 macOS 14.0+ ARM64

cengal_light-4.2.0-cp311-cp311-macosx_13_0_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.11 macOS 13.0+ x86-64

cengal_light-4.2.0-cp310-cp310-macosx_14_0_arm64.whl (7.4 MB view details)

Uploaded CPython 3.10 macOS 14.0+ ARM64

cengal_light-4.2.0-cp310-cp310-macosx_13_0_x86_64.whl (5.8 MB view details)

Uploaded CPython 3.10 macOS 13.0+ x86-64

cengal_light-4.2.0-cp39-cp39-macosx_13_0_x86_64.whl (5.8 MB view details)

Uploaded CPython 3.9 macOS 13.0+ x86-64

cengal_light-4.2.0-cp38-cp38-macosx_13_0_x86_64.whl (5.7 MB view details)

Uploaded CPython 3.8 macOS 13.0+ x86-64

File details

Details for the file cengal_light-4.2.0-pp310-pypy310_pp73-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-pp310-pypy310_pp73-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 08369b566ea576e8488d25d8e0eb2583ad71065a134b8f2101417ac86d912b90
MD5 96f7046a2161b461d837828f8bfee066
BLAKE2b-256 7ce049112bfa6647208b4e515839354b5e9a7451b093809f698345c6fe77730e

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-pp310-pypy310_pp73-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-pp310-pypy310_pp73-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 30ea0f3f2a50813ada0d0e1a3dd6b8ef88925c2d62c5f94c655730be025df79e
MD5 15aa3097dbfa6c61204dae422008ac47
BLAKE2b-256 d25f19fd8a6a8b9b9dfec80c95ad731114aeeb60a3edbe5b90eaf95b13b62a76

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-pp39-pypy39_pp73-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-pp39-pypy39_pp73-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7271616247c498aae0fb72e40a829591581052b1aa4592d3a34500f9aded1905
MD5 0eeb3372f99c071ee2474319c5a0b1e5
BLAKE2b-256 9f544024fbc5dd0a027e3a7ea4bedd9a10c87d5e7c5e28b26f5f24874e30e593

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-pp39-pypy39_pp73-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-pp39-pypy39_pp73-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 32dd30ecc4b2bc63ba4f3250ddfc609fc733492cb327214b93dba6a526588e89
MD5 ce6ba89b4eb4b5a2f84d02c847a86777
BLAKE2b-256 070990ea7b05893db7d4fb146d11fea813af131c5ee23d0fdf417d02af7fd215

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-pp38-pypy38_pp73-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-pp38-pypy38_pp73-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f9cf47a99f4797e28e1e46a7029c9ccfcef07c27f2c8837380302eb43d4a08db
MD5 13a002016a7b461f9e879d7251731bee
BLAKE2b-256 06397f91f42070947a385a24ed6bdff4a7fe6c27e694fce86a0866bb74f8b587

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-pp38-pypy38_pp73-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-pp38-pypy38_pp73-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 1ae5c9833a36b8210e0052ca68bc30ae59538976ce18fc0659c620a98f0ca2c4
MD5 5f92923af9a8f913b0640ad3aa19da71
BLAKE2b-256 11b72d5ac9e447ae3bd0d049769c7f7fe501d082d218cff24483368abb0619cb

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b702d7ff2b5d191a918857252484075ffc134af6d123833da80dfdac5acc3cb6
MD5 d84322a0a9b4d9d3f36e2258030efa7a
BLAKE2b-256 0355ad43bf31ead95ceb8d9de1fc9352f984c4bdec964600bfc9709e8ff097f2

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp313-cp313-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 a36f4f911d85602eadd16966210094df00391618883b9e911543a4e85bc5be89
MD5 ead349e874ef83e227f287f2cfcff556
BLAKE2b-256 efe33c7573462df7b96522c19f29dc42adc9cfee5ab1363e9299af58d3acfffd

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 dbeb8db5ede0bcec259b2f5293e2f89ff130407b74aedcb7e27d49b869fade39
MD5 c427880b0215add877caf5034fba61a2
BLAKE2b-256 fb63d225a52e68ed54ea038d9b19580255e73ffbf5acf398699b4c9626a743e8

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp312-cp312-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 978a437758b66e5a609db7962e960d89bdce1e075cd5463820e69e34a179ae11
MD5 4742dc126ce8eaea210c6fe06e546c32
BLAKE2b-256 9a7842608c5d53eeabb0e85e389d2dee981c8f3a13a5820bb3ed8149e43bb9dd

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 83559ac30797872e749b61ceda60985ba78b033a731a7e3f500ec496e30fb39c
MD5 ef81b3029a4f02dc9f6f862df584803e
BLAKE2b-256 fa0e2e8a3a236ae78615b9937e35df217c78655f984c53505e849e5c8277c02e

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp311-cp311-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 780eba8832173943c6d153f7d817f341d68f930431a2e817c7c32329d102d070
MD5 9026defc28c44367b12543df031eed69
BLAKE2b-256 26695755f68268fe8f555924f56a19f16296aee42a962f8dd6bec4e038efa62e

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 3ca611f40f5e83aa86bfeef2dbe632bed54b9f2bd0d619ddd19db828e3177d43
MD5 379561149586ce2d29d314e87de54818
BLAKE2b-256 ce5eabd9f5899db9ec422621ee672e64f4e4a9d74c71ac577636feb8262b3d38

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp310-cp310-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 fbf63b0a79c937bd37633a14194a19ec97f6b2b160972d7ae3040c44a6b05f58
MD5 3452aaf4281db634086a971f2d8381a5
BLAKE2b-256 68056bb9195ace11bb4a3b43140d68fc4fe67e0ba17c5499b140e30d652fe5f5

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp39-cp39-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp39-cp39-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 e69fe856a33e6ff4eb168b2e48fbd52be062798dd77f6bcaf013201c5c8c40ef
MD5 30dba9e5c8fbf81e7b8d084d484f2b69
BLAKE2b-256 85043010aa29c289fad5767242ef4ad39fe16de359cb31cc72d0c063d53e5e66

See more details on using hashes here.

File details

Details for the file cengal_light-4.2.0-cp38-cp38-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.2.0-cp38-cp38-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 39b203f8afb30008841272cec7346b5a622b2915c83a37ddee9b3f6d4df357e2
MD5 b835ee6cb605b7a033451797c5cd57df
BLAKE2b-256 974e0015aaae045f66146ef52d8fbe990c0efc3ae062b780ee41d0af5f6649fc

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 Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page