Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Python utils and configuration

Configuration

Constants and variables

Config files can be set via CONFIG environ var or passed directly to Config(). The config string can contain full paths to files or directories separated by ;.

Configuration from directory

If a directory is specified, all toml-files from it are taken in alphabetical order. Files with logging in name are ignored by Config.

ls /path/to/config_dir
base.toml     <-- first file for Config
config.toml   <-- second file for Config
logging.toml  <-- file for LoggingConfig

Setup environ

export CONFIG='/path/to/config_dir'

Usage in the code

from ttutils import Config

CFG = Config()  # get config path from CONFIG environ

CFG.PUBLIC_URL  # get from config files
CFG.ENV.CONFIG  # get from os env
CFG.SECRET.KEY  # get from os env and clean

If LOGGING is not set, LoggingConfig takes from CONFIG dir only files with logging in name.

from ttutils import LoggingConfig

LoggingConfig(extra_config={
    'loggers': {
        'aiohttp.access': {  # local overriding
            'level': 'ERROR',
        }
    }
})

If Config() or LoggingConfig() receive file names (not absolute paths) and CONFIG environ var points to a directory, files are loaded as $CONFIG/name:

export CONFIG='/path/to/config_dir'
from ttutils import Config, LoggingConfig

CFG = Config('base.toml')            # loads /path/to/config_dir/base.toml
CFG = LoggingConfig('logging.toml')  # loads /path/to/config_dir/logging.toml

Note: only file names and absolute paths can be mixed in one config string — relative paths like dir/file.toml are also resolved to $CONFIG/dir/file.toml.

Config file selection

config argument CONFIG env loaded files
not set dir all toml-files from dir in alphabetical order, except files with logging in name
not set files files as is (with ;), except files with logging in name
not set not set ConfigError
set ('base.toml') dir $CONFIG/base.toml (except logging in name)
set ('/abs/path.toml') any /abs/path.toml as is (except logging in name)
set ('a.toml;b.toml') any both files (with ;), if CONFIG is dir — $CONFIG/name
set (dir) any toml-files from dir in alphabetical order, except logging in name

Config always skips files with logging in name, regardless of source.

LoggingConfig file selection

config argument LOGGING env CONFIG env loaded files
not set set any files from LOGGING without name filter (paths as is)
not set not set set from CONFIG only files with logging in name (dir -> toml-files with logging in alphabetical order)
not set not set not set ConfigError
set ('logging.toml') ignored dir $CONFIG/logging.toml (without name filter)
set ('/abs/path.toml') ignored any /abs/path.toml as is
set ('x.toml;y.toml') ignored any both files (with ;), if CONFIG is dir — $CONFIG/x.toml, $CONFIG/y.toml

The logging name filter applies only when config is taken from CONFIG environ var — explicit config argument or LOGGING var loads files without filter.

Configuration from files

Full paths to files separated by ; are loaded in order, later files override earlier ones.

export CONFIG='/path/to/base_config.toml;/path/to/config.toml'
from ttutils import Config

CFG = Config('/path/to/config.toml')  # or pass directly

CFG.PUBLIC_URL  # get from config files
CFG.ENV.CONFIG  # get from os env
CFG.SECRET.KEY  # get from os env and clean

Logging config files can be set via LOGGING environ var or passed directly to LoggingConfig().

export LOGGING='/path/to/logging.toml'
from ttutils import LoggingConfig

LoggingConfig('/path/to/logging.toml', extra_config={
    'loggers': {
        'aiohttp.access': {  # local overriding
            'level': 'ERROR',
        }
    }
})

Safe type convertors

from ttutils import try_int, as_bool, to_string, safe_text, text_crop, int_list, int_set

try_int('123') == 123
try_int('asd') is None

as_bool('t') is True
as_bool(1) is True
as_bool('false') is False

to_string(AClass) == '<AClass>'
to_string('text') == 'text'
to_string(b'text') == 'text'

to_bytes('text') == b'text'
to_bytes(b'text') == b'text'
to_bytes(1234567890) == b'I\x96\x02\xd2'

safe_text('<b>text</b>') == '&lt;b&gt;text&lt;/b&gt;'
safe_text('text') == 'text'

text_crop('text', 5) == 'text'
text_crop('sometext', 6) == 'some …'

int_list(['1', '2', 'a', 'b', None]) == [1, 2]
int_set(['1', '2', 'a', 'b', None]) == {1, 2}

Compress

Integer, dict integers, list integers compression/decompression functions

from ttutils import compress

compress.encode(11232423)  # 'GSiD'
compress.decode('GSi')  # 175506

compress.encode_list([12312, 34535, 12323])  # '30o-8rD-30z'
compress.decode_list('30o-8rD-30z--30C')  # [12312, 34535, 12323, 12324, 12325, 12326]

compress.encode_dict({12: [234, 453], 789: [12, 98, 99, 100, 101]})  # 'c-3G-75/cl-c-1y--1B'
compress.decode_dict('c-3G-75/cl-c-1y--1B')  # {12: [234, 453], 789: [12, 98, 99, 100, 101]}

DateTime

Datetime parse and serialize utils

from ttutils import (utcnow, utcnow_ms, utcnow_sec, parsedt, parsedt_ms,
    parsedt_sec, try_parsedt, isoformat, safe_isoformat)

utcnow()      # datetime(2022, 2, 22, 14, 28, 10, 158164, tzinfo=datetime.timezone.utc)
utcnow_ms()   # datetime(2022, 2, 22, 14, 28, 20, 824000, tzinfo=datetime.timezone.utc)
utcnow_sec()  # datetime(2022, 2, 22, 14, 28, 24, tzinfo=datetime.timezone.utc)

parsedt('2022-02-22T11:22:33.123456Z')      # datetime(2022, 2, 22, 11, 22, 33, 123456, tzinfo=datetime.timezone.utc)
parsedt_ms('2022-02-22T11:22:33.123456Z')   # datetime(2022, 2, 22, 11, 22, 33, 123000, tzinfo=datetime.timezone.utc)
parsedt_sec('2022-02-22T11:22:33.123456Z')  # datetime(2022, 2, 22, 11, 22, 33, tzinfo=datetime.timezone.utc)

try_parsedt('2022-02-22T11:22:33.123456Z')  # datetime(2022, 2, 22, 11, 22, 33, 123456, tzinfo=datetime.timezone.utc)
try_parsedt(None)  # None

isoformat(utcnow())      # '2022-02-22T14:33:51.381164Z'
try_isoformat(utcnow())  # '2022-02-22T14:33:51.381164Z'
try_isoformat(None)      # None

Concurrency

Tools for asyncio

To limit the parallelism of an asynchronous function, install a decorator

from ttutils import concurrency_limit

@concurrency_limit(2)
async def my_task(...) -> None:
    ...  # there are only 2 concurrent executions

# the queue length will be recorded in the log when the function is overloaded
log = logging.getLogger('concurrency_logger')

@concurrency_limit(2, logger=log)
async def my_task(...) -> None:
    ...  # there are only 2 concurrent executions

Stats collector

Collector предназначен для:

  • сбора данных о длительности выполнения функций, методов и блоков кода,
  • формированни периодических отчетов о статистике времени выполнения,
  • ведении лога медленных запросов.
from ttutils.stats import Collector

stats = Collector()

@stats.atimer('k1')
async def func():
   ...

class A:
   @stats.atimer('k2')
   async def func(self):
       ...

with stats.timer('k3'):
   sync_func()
   await async_func()

Release files for ttutils 0.11rc3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ttutils 0.11rc3
File Size Uploaded
ttutils-0.11rc3.tar.gz 24.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ttutils 0.11rc3
File Interpreter ABI Platform
ttutils-0.11rc3-py3-none-any.whl Python 3 none any Details

Total release size: 42.2 kB

Release files / ttutils-0.11rc3.tar.gz

Download URL ttutils-0.11rc3.tar.gz
Size 24.7 kB
Tags Source
SHA-256 checksum
How to use checksums
ea67a14a1ae3811571cb81aa44b64d61ee23cdd0b08444d5f3816c4734b1550d
BLAKE2b-256 checksum
How to use checksums
5b19dadf63aaaef5e7ea4d059eaaeecd3a1693797adcb02126e6ede09e13bcfd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / ttutils-0.11rc3-py3-none-any.whl

Download URL ttutils-0.11rc3-py3-none-any.whl
Size 17.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a096933e9afbddbde75267cd059e2a2b2afc6eff6070ed791d06c052bcd708f9
BLAKE2b-256 checksum
How to use checksums
f499df6da1ecf88d9c7f524825f256b3b154b2408a0c247a0609086f0c801ab1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page