Skip to content
This repository has been archived by the owner on Jun 27, 2023. It is now read-only.

Latest commit

 

History

History
277 lines (224 loc) · 12.3 KB

ua_README.md

File metadata and controls

277 lines (224 loc) · 12.3 KB

Проект: tense
Ліцензія: Apache 2.0
Опис: Інструмент для парсингу часу
OS: Незалежний
Python: 3.9+
Typing: Annotated
Тема: Утиліти


Документація · Сповістити про баг · Запропонувати ідею

Зміст
  1. Про проект
  2. Перейти до використання
  3. Використання
  4. Приклади
  5. Вклад у проект
  6. Ліцензия
  7. Контакт
  8. Подяки
  9. Історія проекту

Про проект

PyPi Mypy badge Black Supported python versions

Ласкаво просимо

Чи потрібно Вам було конвертувати, наприклад, строку "1д1хвилина 2 сек" у кількість секунд або об'єкт datetime.timedelta?

Ні? Тоді порадьте наш проект своїм друзям :) Якщо ви ще тут - йдемо далі!

Перейти до використання

PyPi

$ pip3 install tense

Poetry

$ poetry add tense

Використання

Основні можливості

import datetime
from tense import TenseParser

time_string = "1d2minutes 5 sec"

# <-- Digit parser -->
digit_parser = TenseParser(TenseParser.DIGIT)
assert digit_parser.parse(time_string) == 86525

# <-- Timedelta parser -->
delta_parser = TenseParser(TenseParser.TIMEDELTA)
delta_value = delta_parser.parse(time_string)
# <-- Assertions -->
assert isinstance(delta_value, datetime.timedelta)
assert str(delta_value) == "1 day, 0:02:05"

Зміна наявних параметрів

from tense import TenseParser, from_tense_file_source

config_emulation = """
[model.Tense]
multiplier = 2  # секундне значення кожної одиниці часу буде помножене на 2
# !!! Уточнення: Якщо multiplier <= 0, тоді парсери можуть працювати некоректно
# У цьому випадку буде вислано попередження у консоль.

[units.Minute]
duration = 120  # Чом би й ні?...
aliases = хвилина, хвилин, хв
"""
parser = TenseParser(
    TenseParser.TIMEDELTA,
    tenses=from_tense_file_source(config_emulation),
)
delta_value = parser.parse("1 хвилина 10хвилин 9  хв")
assert str(delta_value) == "1:20:00"  # (кожна 120 * 2)

Додавання нових налаштувань

from tense import TenseParser, from_tense_file_source

config_emulation = """
[model.Tense]  # Цей заголовок обов'язковий.

[units.Year]
duration = exp(year)
aliases = рік,

[units.Second]
duration = exp(second)
aliases = с, сек, секунд

[virtual]
duration = exp(year * 10)
aliases = десятиліття, десятиліть
"""

parser = TenseParser(
    TenseParser.TIMEDELTA,
    tenses=from_tense_file_source(config_emulation),
)
delta_value = parser.parse("1рік 10 десятиліть5   секунд")
assert str(delta_value) == "36865 days, 0:00:05"

FAQ

Але що як нам потрібно парсити строку типу: "1day and 10 minutes + 5 seconds"? Давайте подивимось:

>> > from tense import TenseParser

>> > complex_string = "1day and 10 minutes + 5 seconds"

>> > parser = TenseParser(TenseParser.TIMEDELTA)
>> > parser.parse(complex_string)
'0:00:05'

Зачекайте... Що? 5 секунд? Але ж там дні та хвилини...

  • Все окей, ви ж користуєтесь гнучким tense! Проблему можно вирішити двома шляхами:
    1. Ви пишете свій time_resolver
    2. Ви вибираєте з вже існуючих tense.resolvers

Давайте продемонструю! Я буду використовувати інший варіант, так як існуючі резольвери мені підходять.

>> > from tense import TenseParser, resolvers

>> > complex_string = "1day and 10 minutes + 5 seconds"

>> > parser = TenseParser(TenseParser.TIMEDELTA, time_resolver=resolvers.smart_resolver)
>> > parser.parse(complex_string)
'1 day, 0:10:05'

Ну, так вже краще!

tense.application.resolvers.smart_resolver() також не є чутливим до регістру!

>> > from tense import TenseParser, resolvers

>> > complex_string = "1DAY and 10 MINUTES + 5 SECONDS"

>> > parser = TenseParser(TenseParser.TIMEDELTA, time_resolver=resolvers.smart_resolver)
>> > parser.parse(complex_string)
'1 day, 0:10:05'

Приклади

Якщо ви гадаєте, що на цьмоу можливості tense закінчуються, то ви помиляєтесь! Можливостей tense забагато для README, тому я пропоную Вам продовжити перегляд прикладів використання тут:


Tense Приклади

Вклад у проект

Вклади – це те, що робить спільнота з відкритим вихідним кодом таким чудовим місцем для навчання, натхнення та творчості. Будь-який ваш внесок дуже цінується.

Якщо у вас є пропозиція, яка могла б покращити це, розгалужіть репозиторій і створіть запит на включення. Ви також можете відкрити питання з тегом «enhancement». Не забудьте поставити зірку проекту! Дякую ще раз!

  1. Зробіть форк проекта
  2. Зробіть вашу гілку з нововведеннями (git checkout -b feature/AmazingFeature)
  3. Затвердіть зміни (git commit -m 'Add some AmazingFeature')
  4. Внесіть зміни на гілку (git push origin feature/AmazingFeature)
  5. Зробіть пул реквест

Ліцензия

Поширюється під ліцензією Apache 2.0. Див. детальніше LICENSE.

Контакт

Подяки

Історія

Спочатку проект був зроблений асинхронним, що суттєво уповільнювало процес парсингу, адже tense є CPU-bound модулем.

Відрефакторивши проект, ми отримали ~x22.31 прискорення в обробці складних рядків (за допомогою smart_resolver).

Було: ~0.00095030...μs | Стало: ~0.00004260...μs

І ~x38.28 прискорення в обробці простих рядків, відповідно (за допомогою basic_resolver).

Було: ~0.00062400...μs | Стало: ~0.00001630...μs

Попередня (асинхронна) версія, як і раніше, доступна у гілках репозиторію - https://github.com/Animatea/tense/tree/async-final, але сайт із документацією буде змінено. Пакет на PyPi також залишиться у відкритому доступі.