Initial commit
This commit is contained in:
@@ -0,0 +1,283 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: humanize
|
||||
Version: 4.14.0
|
||||
Summary: Python humanize utilities
|
||||
Project-URL: Documentation, https://humanize.readthedocs.io/
|
||||
Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-humanize?utm_source=pypi-humanize&utm_medium=pypi
|
||||
Project-URL: Homepage, https://github.com/python-humanize/humanize
|
||||
Project-URL: Issue tracker, https://github.com/python-humanize/humanize/issues
|
||||
Project-URL: Release notes, https://github.com/python-humanize/humanize/releases
|
||||
Project-URL: Source, https://github.com/python-humanize/humanize
|
||||
Author-email: Jason Moiron <jmoiron@jmoiron.net>
|
||||
Maintainer: Hugo van Kemenade
|
||||
License-Expression: MIT
|
||||
License-File: LICENCE
|
||||
Keywords: humanize time size
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: 3.14
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Topic :: Text Processing
|
||||
Classifier: Topic :: Text Processing :: General
|
||||
Requires-Python: >=3.10
|
||||
Provides-Extra: tests
|
||||
Requires-Dist: freezegun; extra == 'tests'
|
||||
Requires-Dist: pytest; extra == 'tests'
|
||||
Requires-Dist: pytest-cov; extra == 'tests'
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
# humanize
|
||||
|
||||
[](https://pypi.org/project/humanize/)
|
||||
[](https://pypi.org/project/humanize/)
|
||||
[](https://humanize.readthedocs.io/en/latest/?badge=latest)
|
||||
[](https://pypistats.org/packages/humanize)
|
||||
[](https://github.com/python-humanize/humanize/actions)
|
||||
[](https://codecov.io/gh/python-humanize/humanize)
|
||||
[](LICENCE)
|
||||
[](https://tidelift.com/subscription/pkg/pypi-humanize?utm_source=pypi-humanize&utm_medium=badge)
|
||||
|
||||
This modest package contains various common humanization utilities, like turning a
|
||||
number into a fuzzy human-readable duration ("3 minutes ago") or into a human-readable
|
||||
size or throughput. It is localized to:
|
||||
|
||||
- Arabic
|
||||
- Basque
|
||||
- Bengali
|
||||
- Brazilian Portuguese
|
||||
- Catalan
|
||||
- Danish
|
||||
- Dutch
|
||||
- Esperanto
|
||||
- European Portuguese
|
||||
- Finnish
|
||||
- French
|
||||
- German
|
||||
- Greek
|
||||
- Hebrew
|
||||
- Indonesian
|
||||
- Italian
|
||||
- Japanese
|
||||
- Klingon
|
||||
- Korean
|
||||
- Norwegian
|
||||
- Persian
|
||||
- Polish
|
||||
- Russian
|
||||
- Simplified Chinese
|
||||
- Slovak
|
||||
- Slovenian
|
||||
- Spanish
|
||||
- Swedish
|
||||
- Turkish
|
||||
- Ukrainian
|
||||
- Uzbek
|
||||
- Vietnamese
|
||||
|
||||
## API reference
|
||||
|
||||
[https://humanize.readthedocs.io](https://humanize.readthedocs.io/)
|
||||
|
||||
<!-- usage-start -->
|
||||
|
||||
## Installation
|
||||
|
||||
### From PyPI
|
||||
|
||||
```bash
|
||||
python3 -m pip install --upgrade humanize
|
||||
```
|
||||
|
||||
### From source
|
||||
|
||||
```bash
|
||||
git clone https://github.com/python-humanize/humanize
|
||||
cd humanize
|
||||
python3 -m pip install -e .
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Integer humanization
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> humanize.intcomma(12345)
|
||||
'12,345'
|
||||
>>> humanize.intword(123455913)
|
||||
'123.5 million'
|
||||
>>> humanize.intword(12345591313)
|
||||
'12.3 billion'
|
||||
>>> humanize.apnumber(4)
|
||||
'four'
|
||||
>>> humanize.apnumber(41)
|
||||
'41'
|
||||
```
|
||||
|
||||
### Date & time humanization
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> import datetime as dt
|
||||
>>> humanize.naturalday(dt.datetime.now())
|
||||
'today'
|
||||
>>> humanize.naturaldelta(dt.timedelta(seconds=1001))
|
||||
'16 minutes'
|
||||
>>> humanize.naturalday(dt.datetime.now() - dt.timedelta(days=1))
|
||||
'yesterday'
|
||||
>>> humanize.naturalday(dt.date(2007, 6, 5))
|
||||
'Jun 05'
|
||||
>>> humanize.naturaldate(dt.date(2007, 6, 5))
|
||||
'Jun 05 2007'
|
||||
>>> humanize.naturaltime(dt.datetime.now() - dt.timedelta(seconds=1))
|
||||
'a second ago'
|
||||
>>> humanize.naturaltime(dt.datetime.now() - dt.timedelta(seconds=3600))
|
||||
'an hour ago'
|
||||
```
|
||||
|
||||
### Precise time delta
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> import datetime as dt
|
||||
>>> delta = dt.timedelta(seconds=3633, days=2, microseconds=123000)
|
||||
>>> humanize.precisedelta(delta)
|
||||
'2 days, 1 hour and 33.12 seconds'
|
||||
>>> humanize.precisedelta(delta, minimum_unit="microseconds")
|
||||
'2 days, 1 hour, 33 seconds and 123 milliseconds'
|
||||
>>> humanize.precisedelta(delta, suppress=["days"], format="%0.4f")
|
||||
'49 hours and 33.1230 seconds'
|
||||
```
|
||||
|
||||
#### Smaller units
|
||||
|
||||
If seconds are too large, set `minimum_unit` to milliseconds or microseconds:
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> import datetime as dt
|
||||
>>> humanize.naturaldelta(dt.timedelta(seconds=2))
|
||||
'2 seconds'
|
||||
```
|
||||
|
||||
```pycon
|
||||
>>> delta = dt.timedelta(milliseconds=4)
|
||||
>>> humanize.naturaldelta(delta)
|
||||
'a moment'
|
||||
>>> humanize.naturaldelta(delta, minimum_unit="milliseconds")
|
||||
'4 milliseconds'
|
||||
>>> humanize.naturaldelta(delta, minimum_unit="microseconds")
|
||||
'4 milliseconds'
|
||||
```
|
||||
|
||||
```pycon
|
||||
>>> humanize.naturaltime(delta)
|
||||
'now'
|
||||
>>> humanize.naturaltime(delta, minimum_unit="milliseconds")
|
||||
'4 milliseconds ago'
|
||||
>>> humanize.naturaltime(delta, minimum_unit="microseconds")
|
||||
'4 milliseconds ago'
|
||||
```
|
||||
|
||||
### File size humanization
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> humanize.naturalsize(1_000_000)
|
||||
'1.0 MB'
|
||||
>>> humanize.naturalsize(1_000_000, binary=True)
|
||||
'976.6 KiB'
|
||||
>>> humanize.naturalsize(1_000_000, gnu=True)
|
||||
'976.6K'
|
||||
```
|
||||
|
||||
### Human-readable floating point numbers
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> humanize.fractional(1/3)
|
||||
'1/3'
|
||||
>>> humanize.fractional(1.5)
|
||||
'1 1/2'
|
||||
>>> humanize.fractional(0.3)
|
||||
'3/10'
|
||||
>>> humanize.fractional(0.333)
|
||||
'333/1000'
|
||||
>>> humanize.fractional(1)
|
||||
'1'
|
||||
```
|
||||
|
||||
### Scientific notation
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> humanize.scientific(0.3)
|
||||
'3.00 x 10⁻¹'
|
||||
>>> humanize.scientific(500)
|
||||
'5.00 x 10²'
|
||||
>>> humanize.scientific("20000")
|
||||
'2.00 x 10⁴'
|
||||
>>> humanize.scientific(1**10)
|
||||
'1.00 x 10⁰'
|
||||
>>> humanize.scientific(1**10, precision=1)
|
||||
'1.0 x 10⁰'
|
||||
>>> humanize.scientific(1**10, precision=0)
|
||||
'1 x 10⁰'
|
||||
```
|
||||
|
||||
## Localization
|
||||
|
||||
How to change locale at runtime:
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> import datetime as dt
|
||||
>>> humanize.naturaltime(dt.timedelta(seconds=3))
|
||||
'3 seconds ago'
|
||||
>>> _t = humanize.i18n.activate("ru_RU")
|
||||
>>> humanize.naturaltime(dt.timedelta(seconds=3))
|
||||
'3 секунды назад'
|
||||
>>> humanize.i18n.deactivate()
|
||||
>>> humanize.naturaltime(dt.timedelta(seconds=3))
|
||||
'3 seconds ago'
|
||||
```
|
||||
|
||||
You can pass additional parameter `path` to `activate` to specify a path to search
|
||||
locales in.
|
||||
|
||||
```pycon
|
||||
>>> import humanize
|
||||
>>> humanize.i18n.activate("xx_XX")
|
||||
<...>
|
||||
FileNotFoundError: [Errno 2] No translation file found for domain: 'humanize'
|
||||
>>> humanize.i18n.activate("pt_BR", path="path/to/my/own/translation/")
|
||||
<gettext.GNUTranslations instance ...>
|
||||
```
|
||||
|
||||
<!-- usage-end -->
|
||||
|
||||
How to add new phrases to existing locale files:
|
||||
|
||||
```sh
|
||||
xgettext --from-code=UTF-8 -o humanize.pot -k'_' -k'N_' -k'P_:1c,2' -k'NS_:1,2' -k'_ngettext:1,2' -l python src/humanize/*.py # extract new phrases
|
||||
msgmerge -U src/humanize/locale/ru_RU/LC_MESSAGES/humanize.po humanize.pot # add them to locale files
|
||||
```
|
||||
|
||||
How to add a new locale:
|
||||
|
||||
```sh
|
||||
msginit -i humanize.pot -o humanize/locale/<locale name>/LC_MESSAGES/humanize.po --locale <locale name>
|
||||
```
|
||||
|
||||
Where `<locale name>` is a locale abbreviation, eg. `en_GB`, `pt_BR` or just `ru`, `fr`
|
||||
etc.
|
||||
|
||||
List the language at the top of this README.
|
||||
Reference in New Issue
Block a user