Skip to main content

General purpose library

Project description

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

Uploaded Source

Built Distributions

cengal-4.0.2-py3-none-any.whl (16.3 kB view details)

Uploaded Python 3

cengal-4.0.2-pp310-none-win_amd64.whl (15.8 kB view details)

Uploaded PyPy Windows x86-64

cengal-4.0.2-pp310-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.7 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

cengal-4.0.2-pp39-none-win_amd64.whl (15.8 kB view details)

Uploaded PyPy Windows x86-64

cengal-4.0.2-pp39-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.7 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

cengal-4.0.2-pp38-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.7 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

cengal-4.0.2-cp312-none-win_amd64.whl (15.8 kB view details)

Uploaded CPython 3.12 Windows x86-64

cengal-4.0.2-cp312-none-musllinux_1_2_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

cengal-4.0.2-cp312-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

cengal-4.0.2-cp311-none-win_amd64.whl (15.8 kB view details)

Uploaded CPython 3.11 Windows x86-64

cengal-4.0.2-cp311-none-musllinux_1_2_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

cengal-4.0.2-cp311-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

cengal-4.0.2-cp310-none-win_amd64.whl (15.8 kB view details)

Uploaded CPython 3.10 Windows x86-64

cengal-4.0.2-cp310-none-musllinux_1_1_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

cengal-4.0.2-cp310-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

cengal-4.0.2-cp39-none-win_amd64.whl (15.8 kB view details)

Uploaded CPython 3.9 Windows x86-64

cengal-4.0.2-cp39-none-musllinux_1_1_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

cengal-4.0.2-cp39-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

cengal-4.0.2-cp38-none-win_amd64.whl (15.8 kB view details)

Uploaded CPython 3.8 Windows x86-64

cengal-4.0.2-cp38-none-musllinux_1_1_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

cengal-4.0.2-cp38-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.7 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

File details

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

File metadata

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

File hashes

Hashes for cengal-4.0.2.tar.gz
Algorithm Hash digest
SHA256 d6a1840a82b4c7d61d1350d0032e9d9ae21b5b22788699d1c8545fcdc8a97614
MD5 dae0b10401ea1232185838e289b495e6
BLAKE2b-256 bc243ac6539988716b903e89f987956e2d1dd41caae2e4937f49edc33cd67cb4

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-py3-none-any.whl.

File metadata

  • Download URL: cengal-4.0.2-py3-none-any.whl
  • Upload date:
  • Size: 16.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.10

File hashes

Hashes for cengal-4.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c43a59da9628a118962f88ddf30ab5c12b3c57dcea4fa295bab225431e5f1064
MD5 8b69ada7668d43f561e4a4e5f68fea0b
BLAKE2b-256 6241d9eb6749ac5d1ceeb120d17f3c70cb68ec6e0fe559b1accd8c84cebb04cd

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-pp310-none-win_amd64.whl.

File metadata

  • Download URL: cengal-4.0.2-pp310-none-win_amd64.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: PyPy, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.11

File hashes

Hashes for cengal-4.0.2-pp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 e45d8d1c8fc512313432d48ef5c24fded49538f8451689a07e1af387892e5158
MD5 17ed490d016c525d4c4a681d53d1af04
BLAKE2b-256 a4a2c467c0854193b66c3761eee9964630c5d360fede6194c09d43d74ce7be48

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-pp310-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-pp310-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d55421a3508d9bef242b46595a65beefb27005de1153b66ecfa6ddcbc6c617f8
MD5 b9d4f4b6c4bb00b1877f1b228f71ac88
BLAKE2b-256 fec39c1edec1e8404c1929c932cb6a3722e0e4ca9ae8da0b3ad6dd2309f76d0f

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-pp39-none-win_amd64.whl.

File metadata

  • Download URL: cengal-4.0.2-pp39-none-win_amd64.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: PyPy, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.11

File hashes

Hashes for cengal-4.0.2-pp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 ecfbae8b424f1d7b4b8b888af77a4b3714dae448d0bbbe4cfc248201739dc372
MD5 e8f75f527009e661b30789d678ad2096
BLAKE2b-256 67bfccc9dfa8ccda49995e155d5b9fe57bf0c6c16e3f13f554b10e1456d4adcb

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-pp39-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-pp39-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d67e39201f32d2ccbfc4bf0c4d5794a5cb3dcdb14a159f883558dc7af78e7fa1
MD5 2068c4a080979de12a5dd59fab98477e
BLAKE2b-256 e75eba1d0fef3d9f420bd99d3725189f93eb65c4c07b697e49a86d43c5b98630

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-pp38-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-pp38-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ea0e8dd3826a5d6699911a053195285d30866aa4d9d238e6daecc663591127cb
MD5 4d518e4de04ee05967a82b355095e5bb
BLAKE2b-256 e4334f4407f5cb2ffff6dea42db35621ff6272cc4e7bee600b758c55c173d84b

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp312-none-win_amd64.whl.

File metadata

  • Download URL: cengal-4.0.2-cp312-none-win_amd64.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for cengal-4.0.2-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 105d67e1f6c3047ae87781407ca8612542a0d020a459a3450e11e9de803e3f2e
MD5 805951f85c1cb3cc6324927d2932a833
BLAKE2b-256 6dc53aba84ce352780e55af6aa8c2b6a9a8783e7d52e776f1df7cf9007f454e2

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp312-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp312-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a8069ea7b26a7ebd4409db233a997b3a21e01f65da024edbdc9be8b90778ed62
MD5 334e2c667366e276c94e32e0b4a57a18
BLAKE2b-256 c5979549abcb8147d84f31391d203db6358ee3d3258c6bdea8558d6d6572a032

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp312-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp312-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 30ed3ab89c2330811243c4d33840ee5201816cd8954a416d654441a8e9d40315
MD5 14a12ab4ceb60320be9047d6e2644e9c
BLAKE2b-256 bec4a72338002bda80e5d3e8a1a05c9afc164f2f0e975d4bc22367deb34b12d1

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp311-none-win_amd64.whl.

File metadata

  • Download URL: cengal-4.0.2-cp311-none-win_amd64.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for cengal-4.0.2-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 040ff82f0fab6c0f719464d5b8b4c5754753403edc32a8c9b5315172254ac13a
MD5 bf86659daeb6aa9b62d3f77970171739
BLAKE2b-256 cb5440e162e6e7b565f937b204691b67396d63b6cb2af2fe7abd0cc9ab071b9f

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp311-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp311-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 18f376f57d0a92d1320282159514eef1d39418896ca61fc46800d51b1133ab3a
MD5 5fb830036586296371012181910006d1
BLAKE2b-256 25d688973c72bb864cd336cbac199a61d602f909f338f5df1c38a057146d2cd7

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp311-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp311-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 624a46017f86681d0184edab30076734f0816791d072643653500f28543fe29e
MD5 da5c9bdae1b538949efe5a36aaf3128e
BLAKE2b-256 ae82f3d199bdb72e837972aad88ea7fa3f6f6887f5564389ddce22d78aa2917b

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp310-none-win_amd64.whl.

File metadata

  • Download URL: cengal-4.0.2-cp310-none-win_amd64.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.11

File hashes

Hashes for cengal-4.0.2-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 dc97bbef9a3b3f7a8ca53412833945ff5a2f30b6fe7b59448e57dac8de4a149d
MD5 26c97520d2beccd7717e260cace57d43
BLAKE2b-256 bf63729e8804cc7498a94325b9ef78ae4c9c1ae9c3683e4ae57192552b2d8ce1

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp310-none-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp310-none-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f0befdbe5b40b59ff0fc0bd6da7fd9860e145b263e43aa4b0ff0f637cea56c25
MD5 67fd0f9e8d7738f7da63ee1b6855df07
BLAKE2b-256 ef128e4d0a4f7f0e5171bc0f21c5c24694ec8363dbc49b212b22846ad2bcd904

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp310-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp310-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a89fd76e12b10a2682d29dcd796f8e7d0e20bdec7c7458db27e69bad407d620f
MD5 306b21bb33fe0249dd103bbd83d590d5
BLAKE2b-256 f584d6bf11dc9c0962f5b8d8474a5378d69a59f1cabd6bf5388b5924ff2230a2

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp39-none-win_amd64.whl.

File metadata

  • Download URL: cengal-4.0.2-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.11

File hashes

Hashes for cengal-4.0.2-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 3ebc536c914f95dc2e6c8bd784c883f879121967879b44293debc9454151dc2b
MD5 adb9145135342322afb5776a333bddab
BLAKE2b-256 da83c2aa393025ad78f179cc84caeee67d30de4e2a5ed0dc76ef95aa5791e9b1

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp39-none-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp39-none-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7616df67de2c4f7aae802a9bab72a6adce38bee136ffaa7b6b035ab0165d3e71
MD5 2229845386bb7023a7ac788f53a51fa3
BLAKE2b-256 af4512defe2374339013bc31b3399301d31dbd2aeeea6260c75c0d7b7ff29293

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp39-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp39-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 46f6fd782b6e3c4a7da879d25acd7e64c5e4bfe29b88df1c5f7933033595897b
MD5 49c752f2ec8ef47ea8f51ff65ada671b
BLAKE2b-256 18b01df039f969f335efeeb3b99f2a4cd1bf974057b4b458b778f0e5b9142446

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp38-none-win_amd64.whl.

File metadata

  • Download URL: cengal-4.0.2-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.11

File hashes

Hashes for cengal-4.0.2-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 b6cd29a3cb520ca89c2e51b7302d1f81c7f3977050cf8a1bb9cef9ee8da3b159
MD5 8eb758299586868e892558eafc00e8ec
BLAKE2b-256 f95aca2d478590ca631965d1dc6af6ec70a30da4bf6678abd1ee836ae4b008f4

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp38-none-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp38-none-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 071f63836dcb89a5dafe654bb5b67040480a6177bcc285ba3d160d464382c6fd
MD5 693ce0a236f924c793e9cd9e45f18efb
BLAKE2b-256 e1681fa6e85d5f2f02a75c50a6e628240e0d901f3d11515092991f8c48e7d5f6

See more details on using hashes here.

File details

Details for the file cengal-4.0.2-cp38-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cengal-4.0.2-cp38-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0845c807ec860c161a8f6b089cc164c9d046e7e5ba906e033a94241ffe47021e
MD5 be0e5756326c5248210fc3ed5c28b234
BLAKE2b-256 45c8004d48293fd817d78943e0f01764c627ebdddb7a714ef09cf4be528c28a5

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