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() (argument takes priority). Config string contains absolute paths to files separated by ;, later files override earlier ones. Relative paths are not supported (use DirConfig for directories).

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

CFG = Config()  # get config path from CONFIG environ
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 configuration

Logging config files can be set via LOGGING environ var or passed directly to LoggingConfig() (argument takes priority). Config string contains absolute paths to files separated by ;. Relative paths are not supported. extra_config updates sections after files, apply_config (default True) applies config via dictConfig.

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

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

Config file selection

config argument CONFIG env loaded files
not set files files as is (with ;)
not set not set ConfigError
not set dir ConfigError (use DirConfig)
set ('/abs/path.toml') any /abs/path.toml as is
set ('/a.toml;b.toml') any both files (with ;)
set (relative) any ConfigError (only absolute paths)

LoggingConfig file selection

config argument LOGGING env loaded files
not set files files as is (with ;)
not set not set ConfigError
set ('/abs/log.toml') any /abs/log.toml as is
set (relative) any ConfigError (only absolute paths)

Configuration from directory

DirConfig loads configs from a directory specified by CONFIG environ var (must be an existing directory). Relative file names are resolved against it.

export CONFIG='/path/to/config_dir'
ls /path/to/config_dir
base.toml     <-- loaded by DirConfig (alphabetical order)
logging.toml  <-- applied via LoggingConfig
from ttutils import DirConfig

CFG = DirConfig()                      # all toml-files except `logging` in name; `*logging*` applied via LoggingConfig
CFG = DirConfig('db.toml;redis.toml')  # only specified files, `*logging*` still applied
CFG = DirConfig('', 'access.toml')     # only specified log config

DirConfig file selection

config arg log_config arg loaded files
not set not set all toml except *logging*; *logging* via LoggingConfig
'db.toml;redis.toml' not set only specified files; all *logging* via LoggingConfig
not set 'access.toml' all toml except *logging*; only access.toml via LoggingConfig
'db.toml' 'access.toml' only specified files; only access.toml via LoggingConfig

Environ var name can be overridden per class with set_env_name:

Config.set_env_name('MYCONFIG')        # Config and DirConfig now read MYCONFIG
LoggingConfig.set_env_name('MYLOGGING')

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.UTC)
utcnow_ms()   # datetime(2022, 2, 22, 14, 28, 20, 824000, tzinfo=datetime.UTC)
utcnow_sec()  # datetime(2022, 2, 22, 14, 28, 24, tzinfo=datetime.UTC)

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

try_parsedt('2022-02-22T11:22:33.123456Z')  # datetime(2022, 2, 22, 11, 22, 33, 123456, tzinfo=datetime.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.11rc7

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.11rc7
File Size Uploaded
ttutils-0.11rc7.tar.gz 25.6 kB Details

Built distribution (wheel)

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

Total release size: 43.6 kB

Release files / ttutils-0.11rc7.tar.gz

Download URL ttutils-0.11rc7.tar.gz
Size 25.6 kB
Tags Source
SHA-256 checksum
How to use checksums
48f2ec84c0d6a8d56aa9ef90deb1113bb8cb08c6d7b3dd0a563ba37e0a134b83
BLAKE2b-256 checksum
How to use checksums
0d8a0c6d0a03ca36ddba9779e99243d44b92a6d38afb61db00dbd9622a77779d
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.11rc7-py3-none-any.whl

Download URL ttutils-0.11rc7-py3-none-any.whl
Size 18.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
865d1333fb60d3e083d9df7bbfeedb7cbccb8860bf1b6902e36bbbc22ff3132a
BLAKE2b-256 checksum
How to use checksums
ae730481fdeedbec7570a21e6f1d6e5c47c549fee1642d5e28530720f475d88e
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