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.0.tar.gz (664.5 kB view details)

Uploaded Source

Built Distributions

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

Uploaded PyPy Windows x86-64

cengal_light-4.0.0-pp310-pypy310_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.0-pp39-pypy39_pp73-win_amd64.whl (2.1 MB view details)

Uploaded PyPy Windows x86-64

cengal_light-4.0.0-pp39-pypy39_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.0-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.0-cp312-cp312-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.12 Windows x86-64

cengal_light-4.0.0-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.0-cp311-cp311-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.11 Windows x86-64

cengal_light-4.0.0-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.0-cp310-cp310-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

cengal_light-4.0.0-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.0-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.0-cp39-cp39-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.9 Windows x86-64

cengal_light-4.0.0-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.0-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.0-cp38-cp38-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

cengal_light-4.0.0-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.0-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.0.tar.gz.

File metadata

  • Download URL: cengal_light-4.0.0.tar.gz
  • Upload date:
  • Size: 664.5 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.0.tar.gz
Algorithm Hash digest
SHA256 552d31d9832b045ad1639fc6cb050496e078f1c9b263f4c209615db218f38648
MD5 ad6d52a4f563c66ae5332751389ac172
BLAKE2b-256 8ad6c484d012176f4aed0abf45e485e5da28fb39a9209d2ec212eb15d06e1abf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-pp310-pypy310_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 db49376358ad4d6d6c5098260883a260a4787eccd25e4494dcd67e0cbb129f64
MD5 9385e96b9aa079080f007c4b5216f06f
BLAKE2b-256 ad41d8eb5605e1f18017c5ab6490aab77204b176b23c684ca12ca013f68ff9aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d489db1267bc99af5b60e4ccf238a6a1280b8c2959b3cb3e184bd15ea76ac0a7
MD5 0c7fe25c214f93b7d494c2bb3fa9f25d
BLAKE2b-256 869cc3aac74bd869683773ae1d106e7a6e6acd795205bb38918703583cf0f67a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-pp39-pypy39_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 14acb3695512e6ba84df0c0336eb8b5a21658423514350958b01ca5f313143f1
MD5 35cc4b849296c6ee13b1de6084abbc2f
BLAKE2b-256 657e98db5c309feb0df8b1e149984b37037d7b15678913a2f4b1b342332eb69e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dbe033ac9a20781cc12c6d6c6a4c2e954aad19aa582de83e79300ad50c4bb014
MD5 dc17b1b6232b32d883a0b5021705ef74
BLAKE2b-256 a1d512437302261568fa78677de88b3867b2f71da580d1a378049b5f89dea483

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b6dd839c66b6e538469d8dd37ff5dc1eff923d19aebc912052cf2f8fa533c128
MD5 bb739bd20bd1c826b46d2a9f44a1c675
BLAKE2b-256 857a23eefdc279d755e70e2f45638ec7056e9453b44b1e1c3ae240be1131dbd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7c90a40f0fd95b2d77c1b35aa98d102bc2cd88d860792a33da2960a55b2a6fc8
MD5 95130f41cd3e39ad0b07512df23de9fb
BLAKE2b-256 75339d09c4b016c4ce7f30681df54bbf2df072ecc1d549245d2c4bcea34d2dfb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 22e11d0fa97e5f268c46f790ff6dba240e349bd7e3814c9ad7e7ea42535c4d7c
MD5 f238e5b627b845038d205d5e197c9c19
BLAKE2b-256 445401f7fa627ee1388fcef8576e973e581202fabe8c797e1029e3632d9986a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f0da62266807129c844a9f40735d6f1dab7b3f23110a6ae1d31f21ecd9a45805
MD5 e1f959dc5ec93c4433eb3c953ad3fae8
BLAKE2b-256 2432c137e734eebc7fb1fbab632a6ccefffa347e9a1fde83d1bdc4da9ad8aded

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 027c8d163f5e3b0c67dfc7685bfd3e3a6d8c3977d248e9711009aa84a2f39f18
MD5 c373ff207c5a91852241c29f33d02cd2
BLAKE2b-256 d3d3e146d9983f12fe889f5b93aaa0d6d1cc8be7c056157df8a96273adde1170

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e4df70fc6eef601a283b95384dbb9c5d959bf87dd9fb764091f0b00bc5f9b428
MD5 ef1ca2edc40b44559afde76343c3d59f
BLAKE2b-256 d423af362760c8971de70b3295a6ed29de2d0abd44f8b34367efb2643f3be975

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a98d862aee8770299e13759a87c613062eba2dd763e446934cf7622d1a4f4de4
MD5 a3e49a16411e216ea046492ae44cd49e
BLAKE2b-256 0d66ca58aeeefc001aba105cc27b5298884b65c8b379c5ccf141bcd1db3f27df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f10590dd48d8b4cda58046579a8f3a22f1a239c5692a0d6c4ac541a65de6a823
MD5 3eee29bfbf8c4cf8f63f55d0a2a32ac3
BLAKE2b-256 ea9be619d1b9525a5a6658078a753ff5497feae8891154402bcce18231c86096

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 30fa1c3cafdacdd4ba0d8b0f73bc0c805d68a0e4a688d8ca354d9792500a998c
MD5 2d1efc9c115e3497b2555798e86adfe2
BLAKE2b-256 c74956ed07367840af3d77cb982fa83c4d5a61f8653633a9e34fe2140c036672

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 4093860a1c1a0b2055283ed329c8e44832fd30d607f5c659a84df7a14154b0be
MD5 17dbc5286fc51bbdeb8833c77022dfec
BLAKE2b-256 0fedd8fa3f9bd1bcd3c39c177495e66e1b9cf12691a6c530e78ee14ac7d9ba0f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1ef4af0395b7ae62be842086c0dc59d465ea0dfc602363fc28b270c5cc0f6200
MD5 1e9d3f989009c5354d17f3f7a8ccbe69
BLAKE2b-256 b2f5bc99b3f1eac15a90cbc37bc15e6f36529f2615beb6b1355b99d2ac1453b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 131d73a165b06c89cb7dd488736029f7191b96d3a374876712ea40666b06c704
MD5 e8afa22ae4bde8cc085e6db3535fa2b7
BLAKE2b-256 61efb18fd8b2b62728f22f8c72bee9d12bcfe8aa6669cb6443e9cfcf9b77c95b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6afdb068158f8eaa6312c2b8c6135004e49b1139da8b91619e914a7e5d63e3c0
MD5 1789bac344e09d43421c784e969f13d3
BLAKE2b-256 e279100bddf83318e219969e73d850f072d1c2bd0c348eb86d35e6bdf8d76c09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cengal_light-4.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 55c9f2fd655d9d21775f35417a042295529614399c415bdd53e4d582437a826c
MD5 1d3568962357a2c65b5831bab4885096
BLAKE2b-256 d43f1d8b2b0e1916bae3145045634e07de0c53778c91d9ccbf0256a97bfba699

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