Skip to main content

A tiny library to make your outputs more beautiful

Project description

prettyfmt

prettyfmt is a tiny library to make your outputs, logs, and __str__() representations slightly more beautiful.

It offers simple but general functions for formatting and abbreviating objects and dataclasses, dicts, words and phrases, filenames, titles, long strings, timestamps, ages, and sizes.

It won't bloat your project. It's <500 lines of code with just two dependencies: humanize and strif.

Installation

# Use pip
pip install prettyfmt
# Or poetry
poetry add prettyfmt

Usage

See pydoc for details on all functions.

from prettyfmt import *

# Simple abbreviations of objects:
abbrev_obj({"a": "very " * 100 + "long", "b": 23})
# -> "{a='very very very very very very very very very very very very ver…', b=23}"

abbrev_obj(["word " * i for i in range(10)], field_max_len=10, list_max_len=4)
# -> "['', 'word ', 'word word ', 'word word…', …]"

# Abbreviate by character length.
abbrev_str("very " * 100 + "long", 32)
# -> 'very very very very very very v…'

# Abbreviate by character length but don't break words.
abbrev_on_words("very " * 100 + "long", 30)
# -> 'very very very very very very…'

# My favorite, abbreviate but don't break words and keep a few words
# on the end since they might be useful.
abbrev_phrase_in_middle("very " * 100 + "long", 40)
# -> 'very very very very … very very very long'

# This makes it very handy for cleaning up document titles.
ugly_title = "A  Very\tVery Very Needlessly Long  {Strange} Document Title [final edited draft23]"
# -> sanitize_title(ugly_title)
'A Very Very Very Needlessly Long Strange Document Title final edited draft23'
abbrev_phrase_in_middle(sanitize_title(ugly_title))
# -> 'A Very Very Very Needlessly Long Strange … final edited draft23'

# Then you can slugify to get nice filenames or URLs.
from slugify import slugify
slugify(abbrev_phrase_in_middle(sanitize_title(ugly_title)))
# -> 'a-very-very-very-needlessly-long-strange-final-edited-draft23'

# Formatting durations. Good for logging runtimes:
fmt_timedelta(3.33333)
# -> '3s'
fmt_timedelta(.33333)
# -> '333ms'
fmt_timedelta(.033333)
# -> '33.33ms'
fmt_timedelta(.0033333)
# -> '3.33ms'
fmt_timedelta(.00033333)
# -> '333µs'
fmt_timedelta(.000033333)
# -> '33µs'
fmt_timedelta(3333333)
# -> '39d'

# Ages in seconds or deltas.
# Note we use a sensible single numeral to keep things brief, e.g.
# "33 days ago" and not the messier "1 month and 3 days ago".
# This is important in file listings, etc, where we want to optimize
# for space and legibility.
fmt_age(60 * 60 * 24 * 33)
# -> '33 days ago'

fmt_age(60 * 60 * 24 * 33, brief=True)
# -> '33d ago'

# Sizes
fmt_size_human(12000000)
# -> '11.4M'

fmt_size_dual(12000000)
# -> '11.4M (12000000 bytes)'

# Helpful making __str__() methods or printing output:
fmt_words("Hello", None, "", "world!")
# -> 'Hello world!'

fmt_paras(fmt_words("Hello", "world!"), "", "Goodbye.")
# -> 'Hello world!\n\nGoodbye.'

from dataclasses import dataclass
from pathlib import Path

# Example of `abbrev_obj` to customize __str__().
# Allows sorting and truncating based on key and value.
@dataclass
class MyThing:
   file_path: Path
   title: str
   url: str
   body: str

   def __str__(self) -> str:
      return abbrev_obj(
            self,
            # Put an abbreviated title first, then the file path, then the url.
            # The `body` field will be omitted.
            key_filter={
               "title": 64,
               "file_path": 0,
               "url": 128,
            },
      )

str(MyThing(file_path="/tmp/file.txt", title="Something" + "blah " * 50, url="https://www.example.com", body="..."))
# -> "MyThing(title='Somethingblah blah blah blah blah blah blah blah blah blah blah…', file_path=/tmp/file.txt, url=https://www.example.com)"

This project was built from simple-modern-uv.

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

prettyfmt-0.2.0.tar.gz (26.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

prettyfmt-0.2.0-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file prettyfmt-0.2.0.tar.gz.

File metadata

  • Download URL: prettyfmt-0.2.0.tar.gz
  • Upload date:
  • Size: 26.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for prettyfmt-0.2.0.tar.gz
Algorithm Hash digest
SHA256 feba6a541627a1ccf2e2bb7b0b786f103a2dbf0abf983784d8e49c660662688e
MD5 534e052729ddf6569b912448d5c735b8
BLAKE2b-256 13089785c7d64dc5e8f818924f8be8b2604e4dc0cf399d90d9b4b7feed31694b

See more details on using hashes here.

Provenance

The following attestation bundles were made for prettyfmt-0.2.0.tar.gz:

Publisher: publish.yml on jlevy/prettyfmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file prettyfmt-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: prettyfmt-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for prettyfmt-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 30245b03b8bfecbc867522314fc460beca3eb3ef4533bb23b52bc8f7c7aa3219
MD5 1c8f002c011df587e49e18ee87012c16
BLAKE2b-256 8dc04bb38fea45f7379b7d1afb677631b2b21c3a13976cc081c48c0db68a37f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for prettyfmt-0.2.0-py3-none-any.whl:

Publisher: publish.yml on jlevy/prettyfmt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page