Skip to main content

General purpose library

Project description

cengal_light

Package with compiled extensions but without the requirements mandatory installation.

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 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

pip install cengal will install prebuilt wheels for both Windows and Linux

Documentation

Cengal Wiki

For example Cengal Coroutines Concepts & Usage

Exclusive Features: No Alternatives Online

Run concurently following components in a Single (!) Thread

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

Examples

YouTube Showcase

Watch the video

Source code

Tutorial

True Interprocess Shared Memory (Proof of Concept Stage)

Share your data between your Python processes (2 processes currently) and work with them as usual. Work across different processes is made turn by turn (fast operation: using full memory barrier instead of system calls)

Supported types (currently):

  • list - Unlike multiprocessing.shared_memory.ShareableList: mutable and resizable between different processes, supports other containers (lists, tuples, dicts) as an items and implements all list methods. Faster than multiprocessing.shared_memory.ShareableList.
  • dict - currently immutable
  • tuple
  • str
  • bytes
  • bytearray
  • bool
  • float - Unlike values in multiprocessing.shared_memory.ShareableList, supports Addition Assignment (shared_list[20] += 999.3) and all other native methods and operators
  • int - int64, currently. Unlike values in multiprocessing.shared_memory.ShareableList, supports 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

Shared list container (which is not yet fully optimizes currently) is already faster than multiprocessing.shared_memory.ShareableList. And unlike multiprocessing.shared_memory.ShareableList supports Addition Assignment (shared_list[15] += 999) and all other native methods and operators of items. It provides an ability to make more than 30000000 reads/writes per second of an int64 value (shared_list[2] = 1234 / val = shared_list[7]) or more than 1450000 addition assignments per second (shared_list[15] += 999).

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 11 Oct 2023:

More than 190 modules

-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python                         636          18572          21458          59787
Cython                           9            686            415           1817
C                                2             39             26            163
C/C++ Header                     2             14             26             37
-------------------------------------------------------------------------------
SUM:                           649          19311          21925          61804
-------------------------------------------------------------------------------

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

Build

pip install cengal on Mac OS X

or

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

Installation process requires compilation (prebuild Wheels are not prepared yet). 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 Distribution

cengal_light-4.0.2.tar.gz (665.7 kB view details)

Uploaded Source

Built Distributions

cengal_light-4.0.2-pp310-pypy310_pp73-win_amd64.whl (2.1 MB view details)

Uploaded PyPy Windows x86-64

cengal_light-4.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

cengal_light-4.0.2-pp39-pypy39_pp73-win_amd64.whl (2.1 MB view details)

Uploaded PyPy Windows x86-64

cengal_light-4.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

cengal_light-4.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

cengal_light-4.0.2-cp312-cp312-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.12 Windows x86-64

cengal_light-4.0.2-cp312-cp312-musllinux_1_2_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

cengal_light-4.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

cengal_light-4.0.2-cp311-cp311-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.11 Windows x86-64

cengal_light-4.0.2-cp311-cp311-musllinux_1_2_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

cengal_light-4.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

cengal_light-4.0.2-cp310-cp310-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

cengal_light-4.0.2-cp310-cp310-musllinux_1_1_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

cengal_light-4.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

cengal_light-4.0.2-cp39-cp39-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.9 Windows x86-64

cengal_light-4.0.2-cp39-cp39-musllinux_1_1_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

cengal_light-4.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

cengal_light-4.0.2-cp38-cp38-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

cengal_light-4.0.2-cp38-cp38-musllinux_1_1_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

cengal_light-4.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

File details

Details for the file cengal_light-4.0.2.tar.gz.

File metadata

  • Download URL: cengal_light-4.0.2.tar.gz
  • Upload date:
  • Size: 665.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.10

File hashes

Hashes for cengal_light-4.0.2.tar.gz
Algorithm Hash digest
SHA256 704e23c959f18f6796b50bb81fed71dde3ff088ca4faa851e2a25c41893af723
MD5 9b509f1e63562318a6d3252658395ec9
BLAKE2b-256 711284588239f2406c54a6517df793a2413c55df9f7f4af073ca6d819d3e52fc

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-pp310-pypy310_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-pp310-pypy310_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 f0f3ce6dae9d8db94a614212316136e17914743167f01a5e7b0c36fa9e3d6f31
MD5 44784b856f76c268c3b2a0e54531bed7
BLAKE2b-256 45c40b4de955a23a7aa5c246e022d6feb85747064e4c007165dd8bba42acb2e0

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bd6e772983049380487f290e8284024800f8c00b6f994a56b2cd45b6f6c450c0
MD5 e0ae9848dbf35ad55de08fe158a92430
BLAKE2b-256 7b01e00fc9ff8c10325fac7df8e5a18004ac11f1a8dea976f2d7ecf92113d078

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-pp39-pypy39_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-pp39-pypy39_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 cabb15fb6d5c0d99ed754fe28888ea3d9c76719e192bfd6e71fec41343cea5d3
MD5 2f4dadc69ffa88466495ca842fac752f
BLAKE2b-256 064244e57a257a2b308f0c1fccc70961b90622721e0646aca6dbed35dfba1524

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b2a1bafe6fb8938598000d8fa0d05ba5b8d56c6b0e89ea56f8f11df10a283ec0
MD5 f3a2c40d9b8a6fbb3b3c800a4c5a2c3b
BLAKE2b-256 3aab8528a142d884915fd770ad4db63a6e85792dce5bc1d9ffcf55e7291c4dd8

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f8f08dc0761b82a63552fb3fd7485a83600017e2f5e6ca9fc3caafbfc3875ce6
MD5 0f5400314ecef7ba55159359295df198
BLAKE2b-256 67494d65402c672552d57ead131a1fc7b2c8340dad5469870ac2d482e7168299

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9888dad80b3e00cae35f1461392ff22b84cba64e1618fd2835ca4aa3544008b2
MD5 5a90bc33752667aec3cfd324da9acc05
BLAKE2b-256 4a33ed09bf9dd2d1bca53216c3b7c71adab36e6f9bd005e925030598992d36bc

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6f07b2395e55503b4be23ff0ced9f13e7b41662f1022669e3bb195796a7578f2
MD5 3da42821215c3e0604e066e4767036e3
BLAKE2b-256 e79b6fd10553e17728f9b74c6cd1ff1297f66c9ed2dea46cb33b23e2e4d68411

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a7b8bca68aaaea9a43f3a8ac1cc22721374588be9ccf3125e08854b5346f2bc5
MD5 66eaea0a51787e0d2658f4d200565afc
BLAKE2b-256 0f9a3d1c657a187a7efb0268821e84168dcfb96d5f4c62ab7db2579ae814cfb6

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2dc040010d0f4c9377d02960e7166b482f5b04075d22e276945e3c17260e4b55
MD5 0e935fc1698e9a300be3e79fc7e05745
BLAKE2b-256 eb61ceb068b997f6d9dd9628b031864cf21c4118868dc9cb7205bcdf8909fe51

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 aff06c49abe98284809e8b4fbe076afe315bb4eb75fb6ed0b8c4207157be99a2
MD5 16800fae7b28a433fc1c41add96ce75c
BLAKE2b-256 e575349bee19573569555f974290a64758fd99c5dbb59dc0bf8c0d56760f2d1a

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 222d9ede6827805afd37183a09a7c0ea7c294b4653e1d1ce9d0a3cbed9c0d5fc
MD5 602cb67def9b7f7dc7b711d3da55ed23
BLAKE2b-256 3693cfcad5c76a700f22888a16d3bc5419d52930c54156765dceddc67f68f863

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a4b2958e61c9d54edbb31b66a9b3591c1575cf785ea9f61a9f6bc49ecc50a765
MD5 3a59c575da0cfd23ad9e337bdb627153
BLAKE2b-256 d8a8597a9fab845a670f56f1491bceea4d3c3adf6ad245e7c72368275d0a409e

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 965c56b8a584d4cd2c1e4118564bd9c92e9f7dbda8a812fef3d198e93f7bdbd6
MD5 ba78facd8d44129187e57b083b897e19
BLAKE2b-256 361fdd0a1f7a99ea4338dc401d743498c3c732a6e56365d256c205c9c210b62e

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 03ae20bf75d59262ecaa2ea9255a9f73ff529dc61919ba3a50b074a949e8dcfe
MD5 7ec2a79020bf6833c3e40b309e58095a
BLAKE2b-256 74945124b5f9efc7c1b069670e1eb73a6d0887adf007c0b4e4f6f7a92c11655c

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 1c3d35bff285c6bd17d718026471d80c5ca6b865ea912894cdd63cc5cc3afd0c
MD5 e9b75f91b283d8164407715c43bd31a3
BLAKE2b-256 3a5a508b2d10ec739ca96b529d543e2a9009d9029e861b802bddcb89096aecbe

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 00e12d366764c952fa790f91c1fb1f8a6a1422ad121cb263362e2b53e240972d
MD5 c3b7c07f4363d14c01c4c26711770d8b
BLAKE2b-256 3522e7880d3350c99c3ebe6ef3421078a32c50db93b03e1037b1c99d0086b467

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 475a992bf58691cafef1378ecc524e07df6a8af91b3602ccb045076992c5c9ff
MD5 6e13d09f4986828886066717a54663d2
BLAKE2b-256 d96c8c7da3b6d936268a21e82833096b1114e58a0f67c68c649dfc0db4777952

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 21c190a401f6d5ccc56a184043b24c37b854183a87862709b5fbe675fa144e22
MD5 769c942668ade99e6713ced02b4a4299
BLAKE2b-256 2d3423e01e4e0c5a4023a30c80db272c202d88f1e0312594ef4cd3ecb35e5e89

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 e2649e3d5a920a962d8ffecbb09b3b9be5eb5963c01da3ca4a165a6197b3616e
MD5 036c51da6125004a81cff347fdb68ce8
BLAKE2b-256 9b7541a55fa4e94955b6025a7f404244f614d77a94c51b5db6d0bd7403625233

See more details on using hashes here.

File details

Details for the file cengal_light-4.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal_light-4.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4474c3c4872388cc4926989122078ee39b47c344df4e921252a26a3070f72f6a
MD5 97b560233e9a1a4ad0590dba9cf8da08
BLAKE2b-256 ddf69a7d66603395dd285e06e9d464b81f6001617b901c156c7c4dd899023411

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