Wednesday, October 11, 2023

CSS Default Browser Values for HTML Elements

Element Default CSS Value
a:link color: (internal value);
text-decoration: underline;
cursor: auto;
a:visited color: (internal value);
text-decoration: underline;
cursor: auto;
a:link:active color: (internal value);
a:visited:active color: (internal value);
abbr None.
address display: block;
font-style: italic;
area display: none;
article display: block;
aside display: block;
audio None.
b font-weight: bold;
base None.
bdi None.
bdo unicode-bidi: bidi-override;
blockquote display: block;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 40px;
margin-right: 40px;
body display: block;
margin: 8px;
body:focus outline: none;
br None.
button None
canvas None.
caption display: table-caption;
text-align: center;
cite font-style: italic;
code font-family: monospace;
col display: table-column;
colgroup display: table-column-group
datalist display: none;
dd display: block;
margin-left: 40px;
del text-decoration: line-through;
details display: block;
dfn font-style: italic;
dialog None.
div display: block;
dl display: block;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
dt display: block;
em font-style: italic;
embed:focus outline: none;
fieldset display: block;
margin-left: 2px;
margin-right: 2px;
padding-top: 0.35em;
padding-bottom: 0.625em;
padding-left: 0.75em;
padding-right: 0.75em;
border: 2px groove (internal value);
figcaption display: block;
figure display: block;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 40px;
margin-right: 40px;
footer display: block;
form display: block;
margin-top: 0em;
h1 display: block;
font-size: 2em;
margin-top: 0.67em;
margin-bottom: 0.67em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
h2 display: block;
font-size: 1.5em;
margin-top: 0.83em;
margin-bottom: 0.83em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
h3 display: block;
font-size: 1.17em;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
h4 display: block;
margin-top: 1.33em;
margin-bottom: 1.33em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
h5 display: block;
font-size: .83em;
margin-top: 1.67em;
margin-bottom: 1.67em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
h6 display: block;
font-size: .67em;
margin-top: 2.33em;
margin-bottom: 2.33em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
head display: none;
header display: block;
hr display: block;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: auto;
margin-right: auto;
border-style: inset;
border-width: 1px;
html display: block;
html:focus outline: none;
i font-style: italic;
iframe:focus outline: none;
iframe[seamless] display: block;
img display: inline-block;
input None.
ins text-decoration: underline;
kbd font-family: monospace;
label cursor: default;
legend display: block;
padding-left: 2px;
padding-right: 2px;
border: none;
li display: list-item;
link display: none;
main None.
map display: inline;
mark background-color: yellow;
color: black;
menu display: block;
list-style-type: disc;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
padding-left: 40px;
menuitem None.
meta None.
meter None.
nav display: block;
noscript None.
object:focus outline: none;
ol display: block;
list-style-type: decimal;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
padding-left: 40px;
optgroup None.
option None.
output display: inline;
p display: block;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
param display: none;
picture None.
pre display: block;
font-family: monospace;
white-space: pre;
margin: 1em 0;
progress None.
q display: inline;
q::before content: open-quote;
q::after content: close-quote;
rp None.
rt line-height: normal;
ruby None.
s text-decoration: line-through;
samp font-family: monospace;
script display: none;
section display: block;
select None.
small font-size: smaller;
source None.
span None.
strike text-decoration: line-through;
strong font-weight: bold;
style display: none;
sub vertical-align: sub;
font-size: smaller;
summary display: block;
sup vertical-align: super;
font-size: smaller;
table display: table;
border-collapse: separate;
border-spacing: 2px;
border-color: gray;
tbody display: table-row-group;
vertical-align: middle;
border-color: inherit;
td display: table-cell;
vertical-align: inherit;
template None.
textarea None.
tfoot display: table-footer-group;
vertical-align: middle;
border-color: inherit;
th display: table-cell;
vertical-align: inherit;
font-weight: bold;
text-align: center;
thead display: table-header-group;
vertical-align: middle;
border-color: inherit;
time None.
title display: none;
tr display: table-row;
vertical-align: inherit;
border-color: inherit;
track None.
u text-decoration: underline;
ul display: block;
list-style-type: disc;
margin-top: 1em;
margin-bottom: 1 em;
margin-left: 0;
margin-right: 0;
padding-left: 40px;
var font-style: italic;
video None.
wbr None.
html display: block;
html:focus outline: none;
i font-style: italic;
iframe:focus outline: none;
iframe[seamless] display: block;
img display: inline-block;
input None.
ins text-decoration: underline;
kbd font-family: monospace;
label cursor: default;
legend display: block;
padding-left: 2px;
padding-right: 2px;
border: none;
li display: list-item;
link display: none;
main None.
map display: inline;
mark background-color: yellow;
color: black;
menu display: block;
list-style-type: disc;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
padding-left: 40px;
menuitem None.
meta None.
meter None.
nav display: block;
noscript None.
object:focus outline: none;
ol display: block;
list-style-type: decimal;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
padding-left: 40px;
optgroup None.
option None.
output display: inline;
p display: block;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
param display: none;
picture None.
pre display: block;
font-family: monospace;
white-space: pre;
margin: 1em 0;
progress None.
q display: inline;
q::before content: open-quote;
q::after content: close-quote;
rp None.
rt line-height: normal;
ruby None.
s text-decoration: line-through;
samp font-family: monospace;
script display: none;
section display: block;
select None.
small font-size: smaller;
source None.
span None.
strike text-decoration: line-through;
strong font-weight: bold;
style display: none;
sub vertical-align: sub;
font-size: smaller;
summary display: block;
sup vertical-align: super;
font-size: smaller;
table display: table;
border-collapse: separate;
border-spacing: 2px;
border-color: gray;
tbody display: table-row-group;
vertical-align: middle;
border-color: inherit;
td display: table-cell;
vertical-align: inherit;
template None.
textarea None.
tfoot display: table-footer-group;
vertical-align: middle;
border-color: inherit;
th display: table-cell;
vertical-align: inherit;
font-weight: bold;
text-align: center;
thead display: table-header-group;
vertical-align: middle;
border-color: inherit;
time None.
title display: none;
tr display: table-row;
vertical-align: inherit;
border-color: inherit;
track None.
u text-decoration: underline;
ul display: block;
list-style-type: disc;
margin-top: 1em;
margin-bottom: 1 em;
margin-left: 0;
margin-right: 0;
padding-left: 40px;
var font-style: italic;
video None.
wbr None.
***** 
Selector Example Example description
.class .intro Selects all elements with class="intro"
.class1.class2 .name1.name2 Selects all elements with both name1 and name2 set within its class attribute
.class1 .class2 .name1 .name2 Selects all elements with name2 that is a descendant of an element with name1
#id #firstname Selects the element with id="firstname"
* * Selects all elements
element p Selects all <p> elements
element.class p.intro Selects all <p> elements with class="intro"
element,element div, p Selects all <div> elements and all <p> elements
element element div p Selects all <p> elements inside <div> elements
element>element div > p Selects all <p> elements where the parent is a <div> element
element+element div + p Selects the first <p> element that is placed immediately after <div> elements
element1~element2 p ~ ul Selects every <ul> element that is preceded by a <p> element
[attribute] [target] Selects all elements with a target attribute
[attribute=value] [target="_blank"] Selects all elements with target="_blank"
[attribute~=value] [title~="flower"] Selects all elements with a title attribute containing the word "flower"
[attribute|=value] [lang|="en"] Selects all elements with a lang attribute value equal to "en" or starting with "en-"
[attribute^=value] a[href^="https"] Selects every <a> element whose href attribute value begins with "https"
[attribute$=value] a[href$=".pdf"] Selects every <a> element whose href attribute value ends with ".pdf"
[attribute*=value] a[href*="w3schools"] Selects every <a> element whose href attribute value contains the substring "w3schools"
:active a:active Selects the active link
::after p::after Insert something after the content of each <p> element
::before p::before Insert something before the content of each <p> element
:checked input:checked Selects every checked <input> element
:default input:default Selects the default <input> element
:disabled input:disabled Selects every disabled <input> element
:empty p:empty Selects every <p> element that has no children (including text nodes)
:enabled input:enabled Selects every enabled <input> element
:first-child p:first-child Selects every <p> element that is the first child of its parent
::first-letter p::first-letter Selects the first letter of every <p> element
::first-line p::first-line Selects the first line of every <p> element
:first-of-type p:first-of-type Selects every <p> element that is the first <p> element of its parent
:focus input:focus Selects the input element which has focus
:fullscreen :fullscreen Selects the element that is in full-screen mode
:hover a:hover Selects links on mouse over
:in-range input:in-range Selects input elements with a value within a specified range
:indeterminate input:indeterminate Selects input elements that are in an indeterminate state
:invalid input:invalid Selects all input elements with an invalid value
:lang(language) p:lang(it) Selects every <p> element with a lang attribute equal to "it" (Italian)
:last-child p:last-child Selects every <p> element that is the last child of its parent
:last-of-type p:last-of-type Selects every <p> element that is the last <p> element of its parent
:link a:link Selects all unvisited links
::marker ::marker Selects the markers of list items
:not(selector) :not(p) Selects every element that is not a <p> element
:nth-child(n) p:nth-child(2) Selects every <p> element that is the second child of its parent
:nth-last-child(n) p:nth-last-child(2) Selects every <p> element that is the second child of its parent, counting from the last child
:nth-last-of-type(n) p:nth-last-of-type(2) Selects every <p> element that is the second <p> element of its parent, counting from the last child
:nth-of-type(n) p:nth-of-type(2) Selects every <p> element that is the second <p> element of its parent
:only-of-type p:only-of-type Selects every <p> element that is the only <p> element of its parent
:only-child p:only-child Selects every <p> element that is the only child of its parent
:optional input:optional Selects input elements with no "required" attribute
:out-of-range input:out-of-range Selects input elements with a value outside a specified range
::placeholder input::placeholder Selects input elements with the "placeholder" attribute specified
:read-only input:read-only Selects input elements with the "readonly" attribute specified
:read-write input:read-write Selects input elements with the "readonly" attribute NOT specified
:required input:required Selects input elements with the "required" attribute specified
:root :root Selects the document's root element
::selection ::selection Selects the portion of an element that is selected by a user
:target #news:target Selects the current active #news element (clicked on a URL containing that anchor name)
:valid input:valid Selects all input elements with a valid value
:visited a:visited Selects all visited links
 ******

All CSS Combinator Selectors

Selector Example Example description
element element div p Selects all <p> elements inside <div> elements
element>element div > p Selects all <p> elements where the parent is a <div> element
element+element div + p Selects the first <p> element that are placed immediately after <div> elements
element1~element2 p ~ ul Selects every <ul> element that are preceded by a <p> element
 

Custom Styling Radio Input Dark Theme

<style>
div {
  background: black;
  opacity: 0.8;
}
input[type="radio"] {
    position: absolute;
    opacity: 0;
}

input[type="radio"] + .radio {
    border: 1px solid cyan;
    border-radius: 50%;
    display: inline-block;
    width: 10px;
    height: 10px;
}

input[type="radio"]:checked + .radio {
    background: cyan;
}
span.whitetext {
  color:white;
}
</style>

<div>
<label for="male">
    <input id="male" type="radio" name="gender" value="male" />
    <span class="radio"></span>
    <span class="whitetext">Male</span>
</label>

<label for="female">
    <input id="female" type="radio" name="gender" value="female" checked />
    <span class="radio"></span>
    <span class="whitetext">Female</span>
</label>
</div>

 

Emoji in the Browser

HTML

The most straightforward way. You can paste the previously chosen Emoji.

<p>🔥</p>

Your other option is to use the codepoint of the Emoji and replacing U+ with &#x.

<p>&#x1F525</p>

CSS

In CSS you need to use the ::before or ::after pseudo-element coupled with the content property where you paste the Emoji as the value.

/* You need an HTML element with the class 'element' */
.element::before {
  content: "🔥";
}

The same way, you can use codepoint replacing U+ with \0.

/* You need an HTML element with the class 'element' */
.element::before {
  content: "\01F525";
}

JavaScript

In JavaScript you need to specify the innerHTML by pasting the Emoji.

/* You need an HTML element with the class 'element' */
document.querySelector(".element").innerHTML = "🔥";

Similarly, you can use the String method fromCodePoint mixed with the codepoint value where you replace U+ with 0x.

/* You need an HTML element with the class 'element' */
document.querySelector(".element").innerHTML = String.fromCodePoint(0x1F525);

****
<style> 
body {
  font-family: Arial, sans-serif;
}

.css-1::before {
  content: "🔥";
}

.css-2::before {
  /* replace U+ with \0 */
  content: "\01F525";
}

p {
  
}

.fire {
  font-size: 24px;
}
</style> 
  <h1>Emoji's in the Web</h1>

<p><span class="fire html-1">🔥</span> Insert in HTML by copy pasting</p>

<!-- replace U+ with &#x -->
<p><span class="fire html-2">&#x1F525</span> Insert in HTML with its codepoint (replace U+ with &#x)</p>

<p><span class="fire css-1"></span> Insert in CSS by copy pasting</p>

<!-- replace U+ with \0 -->
<p><span class="fire css-2"></span> Insert in CSS with its codepoint (replace U+ with \0)</p>

<p><span class="fire js-1"></span> Insert in JS by copy pasting</p>

<!-- replace U+ with 0x -->
<p><span class="fire js-2"></span> Insert in JS with its codepoint (replace U+ with 0x)</p>


<p><a href="https://emojipedia.org/" target="_blank">Find your Emoji's</a></p>
 
<script>
document.querySelector(".js-1").innerHTML = "🔥";

// replace U+ with 0x
document.querySelector(".js-2").innerHTML = String.fromCodePoint(0x1F525);   
</script> 
https://css-tricks.com/the-checkbox-hack/ 

Monday, October 2, 2023

Python Asyncio Libraries 2023


Web Frameworks

Libraries to build web applications.

  • FastAPI - A very high performance Python 3.6+ API framework based on type hints. Powered by Starlette and Pydantic.
  • Django - An established, high-level Python web framework with a huge community and ecosystem.
  • Starlette - A lightweight ASGI framework/toolkit for building high performance services.
  • aiohttp - Http client/server for asyncio (PEP-3156).
  • sanic - Python 3.5+ web server that's written to go fast.
  • Quart - An asyncio web microframework with the same API as Flask.
  • autobahn - WebSocket and WAMP supporting asyncio and Twisted, for clients and servers.
  • websockets - A library for building WebSocket servers and clients in Python with a focus on correctness and simplicity.
  • Tornado - Performant web framework and asynchronous networking library.
  • uvicorn - The lightning-fast ASGI server.

Message Queues

Libraries to implement applications using message queues.

  • aioamqp - AMQP implementation using asyncio.
  • pyzmq - Python bindings for ZeroMQ.
  • aiozmq - Alternative Asyncio integration with ZeroMQ.
  • crossbar - Crossbar.io is a networking platform for distributed and microservice applications.
  • asyncio-nats - Client for the NATS messaging system.
  • aiokafka - Client for Apache Kafka.

Database Drivers

Libraries to connect to databases.

  • asyncpg - Fast PostgreSQL Database Client Library for Python/asyncio.
  • asyncpgsa - Asyncpg with sqlalchemy core support.
  • aiopg - Library for accessing a PostgreSQL database.
  • aiomysql - Library for accessing a MySQL database
  • aioodbc - Library for accessing a ODBC databases.
  • motor - The async Python driver for MongoDB.
  • redis-py - Redis Python Client (which includes aioreadis now).
  • aiocouchdb - CouchDB client built on top of aiohttp (asyncio).
  • aioinflux - InfluxDB client built on top of aiohttp.
  • aioes - Asyncio compatible driver for elasticsearch.
  • peewee-async - ORM implementation based on peewee and aiopg.
  • GINO - is a lightweight asynchronous Python ORM based on SQLAlchemy core, with asyncpg dialect.
  • Tortoise ORM - native multi-backend ORM with Django-like API and easy relations management.
  • Databases - Async database access for SQLAlchemy core, with support for PostgreSQL, MySQL, and SQLite.
  • Prisma Client Python - An auto-generated, fully type safe ORM powered by Pydantic and tailored specifically for your schema - supports SQLite, PostgreSQL, MySQL, MongoDB, MariaDB and more.
  • Piccolo - An ORM / query builder which can work in async and sync modes, with a nice admin GUI, and ASGI middleware.
  • Beanie - An async MongoDB ODM built on motor and Pydantic.

Networking

Libraries to communicate in your network.

  • AsyncSSH - Provides an asynchronous client and server implementation of the SSHv2 protocol.
  • aiodns - Simple DNS resolver for asyncio.
  • aioping - Fast asyncio implementation of ICMP (ping) protocol.
  • httpx - asynchronous HTTP client for Python 3 with requests compatible API.

GraphQL

Libraries to build GraphQL servers.

  • Ariadne - Schema-first Python library for implementing GraphQL servers.
  • Tartiflette - Schema-first Python 3.6+ GraphQL engine built on top of libgraphqlparser.
  • Strawberry - Code-first Python 3 GraphQL server with Django, Flask and FastAPI/Starlette support.

Testing

Libraries to test asyncio based applications.

  • aiomock - A python mock library that supports async methods.
  • asynctest - Enhance the standard unittest package with features for testing. asyncio libraries
  • pytest-asyncio - Pytest support for asyncio.
  • aresponses - Asyncio http mocking. Similar to the responses library used for requests.
  • aioresponses - Helper for mock/fake web requests in Python aiohttp package.

Alternative Loops

Alternative asyncio loop implementations.

  • uvloop - Ultra fast implementation of asyncio event loop on top of libuv.

Misc

Other awesome asyncio libraries.

  • aiochan - CSP-style concurrency with channels, select and multiprocessing on top of asyncio.
  • aiocache - Cache manager for different backends.
  • aiofiles - File support for asyncio.
  • aiopath - Asynchronous pathlib for asyncio.
  • aiodebug - A tiny library for monitoring and testing asyncio programs.
  • aiorun - A run() function that handles all the usual boilerplate for startup and graceful shutdown.
  • aiosc - Lightweight Open Sound Control implementation.
  • aioserial - A drop-in replacement of pySerial.
  • aiozipkin - Distributed tracing instrumentation for asyncio with zipkin
  • asgiref - Backend utils for ASGI to WSGI integration, includes sync_to_async and async_to_sync function wrappers.
  • async_property - Python decorator for async properties.
  • ruia - An async web scraping micro-framework based on asyncio.
  • kubernetes_asyncio - Asynchronous client library for Kubernetes.
  • aiomisc - Miscellaneous utils for asyncio.
  • taskiq - Asynchronous distributed task manager (like celery, but async).

Writings

Documentation, blog posts, and other awesome writing about asyncio.

Talks

Recordings of awesome talks about asyncio.

Alternatives to asyncio

Alternative approaches to async programming in Python, some of which attempt to support some compatibility with asyncio, others are not compatible at all.

  • curio - The coroutine concurrency library.
  • trio - Pythonic async I/O for humans and snake people.
    • trio-asyncio - re-implementation of the asyncio mainloop on top of Trio.
  • AnyIO - High level asynchronous concurrency and networking framework that works on top of either trio or asyncio.

Source: https://github.com/timofurrer/awesome-asyncio 

*****

A list of libraries for AsyncIO is available on PyPI with Framework::AsyncIO classifier.

Alternative event loop implementations

  • uvloop: Ultra fast implementation of asyncio event loop on top of libuv. Read more about uvloop here.
  • async-tokio: Asyncio event loop implementation, written in Rust language

Libraries

  • aiofiles: File support for asyncio
  • aiocache: Caching for asyncio with multiple backends (framework agnostic)
  • aiorwlock: Read write lock for asyncio
  • aioutils: Python3 Asyncio Utils, Group (like gevent.pool.Group), Pool (like gevent.pool.Pool), Bag and OrderedBag
  • tasklocals: Task-local variables
  • janus: Thread-safe asyncio-aware queue
  • asyncio_extras: asynchronous generator/context manager support, thread pool integration, async file operations and more
  • paco: Small utility library for coroutine-driven asynchronous programming
  • aioconsole: Asynchronous console and interfaces for asyncio
  • aiostream: Generator-based operators for asynchronous iteration

Unit testing

  • asynctest: Enhance the standard unittest package for testing asyncio libraries
  • pytest-asyncio: Pytest support for asyncio

Protocols implementations

Clients

  • AMQP:
    • aioamqp: AMQP implementation using asyncio (Used by RabbitMQ)
    • QBroker: easy-to-use library based on aioamqp, for pub/sub and RPC
  • AMI: panoramisk, a library to play with Asterisk's protocols: AMI and FastAGI
  • Cassandra: aiocassandra, Simple threaded cassandra wrapper for asyncio
  • CouchDB: aiocouchdb, CouchDB client
  • DNS: aiodns: Async DNS resolver
  • ElasticSearch:
  • Etcd: aioetcd: Coroutine-based etcd client
  • Google Hangouts: hangups: Client for Google Hangouts
  • HTTP: aiohttp.requests: http client with Requests-like API.
  • IRC:
    • irc3, plugable irc client library based on python's asyncio
    • bottom, asyncio-based rfc2812-compliant IRC Client
  • Kafka: aiokafka: Full featured Kafka client for Kafka 9.0.0+
  • memcached: aiomemcache, minimal memcached client
  • MongoDB:
  • MPD: aiompd, Music Player Daemon client for AsyncIO
  • MySQL: aiomysql, MySQL driver
  • ODBC: aioodbc, ODBC client on top of pyodbc, works only with python 3.5+
  • PostgreSQL:
    • aiopg, PostgreSQL client library built on top of psycopg2
    • aiopg8000, A Pure-Python PostgreSQL driver for AsyncIO
    • asyncpg, A fast PostgreSQL Database Client Library for Python/asyncio
  • Prometheus: prometheus_async adds support for asynchronous frameworks to the official Python client for the Prometheus metrics and monitoring system.
  • PySerial: asyncserial: asyncio support for pySerial
  • Redis:
  • Riak: aioriak: Python asyncio client for Riak
  • Slack aioslacker: slacker wrapper for asyncio
  • SIP: aiosip: SIP support for AsyncIO
  • Socks: aiosocks: SOCKS proxy client for asyncio and aiohttp
  • SSH: AsyncSSH: SSH client and server implementation
  • WebSockets: aiohttp.ws_connect: WebSockets client
  • XMPP (Jabber):
    • slixmpp, SleekXMPP (XMPP Library) fork using asyncio, for poezio,
    • aioxmpp, from scratch XMPP library for asyncio (alpha)
  • Zipkin: aiozipkin: Distributed tracing instrumentation for asyncio with zipkin

Servers

  • FastAGI: panoramisk, a library to play with Asterisk's protocols: AMI and FastAGI
  • IRC: irc3d, irc server library based on irc3
  • HTTP: aiohttp: http client and server infrastructure for asyncio
  • SSH: AsyncSSH: SSH client and server implementation
  • SMTP/LMTP: aiosmtpd: Server implementations and testing frameworks for Simple Mail Transport Protocol and Local Mail Transport Protocol.

Web Frameworks

For classical HTTP/1.1 protocol

Looking for WSGI? Read this thread: WSGI implementation compatible with asyncio?.

  • aiohttp.web: a Flask-like API to build quickly HTTP applications, made by the creators of aiohttp
  • aiopyramid: Tools for running pyramid using asyncio
  • aiotraversal: Web framework for big complicated applications based on aiohttp
  • aiowsgi: minimalist wsgi server using asyncio
  • Growler: A web framework built on top of aiohttp
  • interest: event-driven web framework on top of aiohttp/asyncio
  • muffin: A web framework based on Asyncio stack (early alpha)
  • nacho: web framework
  • Pulsar: Event driven concurrent framework for python. With pulsar you can write asynchronous servers performing one or several activities in different threads and/or processes.
  • rainfall: another web framework
  • sanic: A Flask-like Python 3.5+ web server that's written to go fast.
  • Vase: web framework

For WebSockets

ORMs

  • aiopg.sa: support for SQLAlchemy functional SQL layer, based on aiopg
  • aiomysql.sa: support for SQLAlchemy functional SQL layer, based on aiomysql
  • peewee: peewee-async, library providing asynchronous interface powered by asyncio for peewee ORM.
  • GINO: lightweight ORM based on asyncpg and SQLAlchemy core

Integration with other applications

  • API-Hour: Transform easily your AsyncIO server source code (HTTP, SSH, ...) to be multiprocess: it will help to improve the efficency on multi-CPU servers.
  • Gunicorn: Gunicorn has gaiohttp worker built on top of aiohttp library

Applications built with AsyncIO

  • ktcal2: SSH brute forcer tool and library, using AsyncIO of Python 3.4

Run asyncio on top of

  • eventlet: aioeventlet, asyncio API implemented on top of eventlet

Adapters for other event loops

Some people have already written adapters for integrating asyncio with other async I/O frameworks.

Misc

  • aioauth-client: OAuth1/2 support (authorization, resource's loading)
  • aiocron: Crontabs for asyncio
  • aiomas: A library for multi-agent systems and RPC based on asyncio
  • aiotest: test suite to validate an implementation of the asyncio API
  • aioprocessing: A Python 3.3+ library that integrates the multiprocessing module with asyncio
  • blender-asyncio: Asyncio Bridge for Blender Python API
  • ipython-yf: An ipython extension to make it asyncio compatible
  • aiogearman: asyncio gearman support. Gearman provides a generic application framework to farm out work to other machines or processes that are better suited to do the work.
  • aiogear: Yet another gearman protocol implemented in asyncio.
  • Serial port using the serial module, see using serial port in python3 asyncio at Stackoverflow, serial.Serial can be registered with loop.add_reader().
  • async_lru: port of functools.lru_cache to asyncio
  • GoogleScraper: A Python module to scrape several search engines (like Google, Yandex, Bing, Duckduckgo, Baidu and others) by using proxies (socks4/5, http proxy) and with many different IP's.
  • aiotasks: A Celery like task manager that distributes Asyncio coroutines.

Filesystem

asyncio does not support asynchronous operations on the filesystem. Even if files are opened with O_NONBLOCK, read and write will block.

Read asynchronous disk I/O (October 2012 by arvid).

The Linux kernel provides asynchronous operations on the filesystem (aio), but it requires a library and it doesn't scale with many concurrent operations. See aio.

The GNU C library (glibc) implements the POSIX aio interface, but it is implemented with threads. See aio(7) manual page.

Recent discussion on the Linux Kernel: Non-blocking buffered file read operations (September 2014).

For now, the workaround is to use aiofiles that uses threads to handle files.

Python Convert TSV to TMX

Given the tsv (tab delimited file) file data.csv with this content:

English\tRomanian
Hello my name is John.\tSalut, numele meu e John.
Today is Monday.\tAzi e luni.

import pandas as pd
import datetime

def tsv_t_tmx(myfile='data.csv', source_lang='en', target_lang='ro', separator='\t'):
  now = datetime.datetime.now()
  d2 = now.strftime("%Y-%m-%d %H:%M:%S")
  df = pd.read_csv(myfile, sep=separator)
  f = open("demofile2.xml", "w", encoding="UTF-8")

  f.write('''<?xml version="1.0" encoding="UTF-8" ?>
             <tmx version="1.4">''')
  f.write(f'''<header creationdate="{d2}"
             srclang= "{source_lang}"
             adminlang="en"
             o-tmf="unknown"
             segtype="sentence"
             creationtool="Python"
             creationtoolversion="unknown"
             datatype="PlainText" />
      <body>\n''')

  for index, row in df.iterrows():
    eng = row['English']
    rom = row['Romanian']
      
    f.write(f'''
        <tu>
         <tuv xml:lang="{source_lang}">
            <seg>{eng}</seg>
         </tuv>
        <tuv xml:lang="{target_lang}">
           <seg>{rom}</seg>
         </tuv>
        </tu>''')

  f.write('''
      </body>
            </tmx>''')

  f.close()  
  base_file = "demofile2.xml"
  name, ext = base_file.split('.')
  new_file = '{}.{}'.format(name, 'tmx')

  with open(base_file , 'r') as f1:
      with open(new_file, 'w') as f2:
          f2.write(f1.read())  

if __name__ == "__main__":
  tsv_t_tmx()  

*****

TMX model:

<tmx version="1.4"><header creationtool="" creationtoolversion="" segtype="phrase" o-tmf="" adminlang="en" srclang="en" datatype="PlainText" o-encoding="UTF-8" /><body><tu><tuv xml:lang="en"><seg /></tuv></tu><tu><tuv xml:lang="en"><seg /></tuv></tu><tu><tuv xml:lang="en"><seg /></tuv></tu></body></tmx>

*****

<?xml version="1.0" encoding="UTF-8" ?>
             <tmx version="1.4"><header creationdate="2023-03-16 20:30:30"
             srclang= "en"
             adminlang="en"
             o-tmf="unknown"
             segtype="sentence"
             creationtool="Python"
             creationtoolversion="3.11"
             datatype="PlainText" />
      <body>

        <tu>
         <tuv xml:lang="en">
            <seg>Hello my name is John.</seg>
         </tuv>
        <tuv xml:lang="ro">
           <seg>Salut, numele meu e John.</seg>
         </tuv>
        </tu>
        <tu>
         <tuv xml:lang="en">
            <seg>Today is Monday.</seg>
         </tuv>
        <tuv xml:lang="ro">
           <seg>Azi e luni.</seg>
         </tuv>
        </tu>
      </body>
            </tmx>