# M🌚ri Message Linter

## Мощный, либеральный, классный - Проверит сообщения, скажет, что не так 💖


### Introduction
 - [О проекте](#about)

### Quick start
 - [Установка](#installation)
 - [Проверка сообщения](#lint-message)
 - [Конфигурация и настройка линтера](#configure-linter)
 - [Проверка сообщений из файлов](#lint-files)
 - [Конфигурация и настройка линтера через командную строку](#configure-file-linter)

### General API Documentation
  * Configuration
    - [LintConfig](#lintconfig)
  * Linter Interfaces
    - [MoriLinter](#morilinter)
    - [MoriFileLinter](#morifilelinter)



### About
M🌚ri Message Linter разработан в связи с несколькими прецедентами по количеству слов, 
а также общему содержанию в пожеланиях Доброго утра и Спокойной ночки. Чтобы избежать
в будущем подобных инцидентов, было проведено исследование по анализу всех ранее
написанных пожеланий утречка и ночки, выведены основные показатели KPI и метрики,
влияющие на положительный результат в настроении и эмоциональном фоне МикроМаши.

Основная идея проекта заключается в автоматизации и оптимизации проверки сообщений
на соответствие стандартам, полученных в результате исследований и анализа информации,
собранной из сообщений за прошедшее время и периоды.
Такой подход к контролю качества сообщений позволит предупредить и исключить некоторые
возможные неприятные и непредвиденные ситуации.

А на само создание меня вдохновила одна очень красивая и вообще 
самая лучшая девочка в Наблюдаемой Вселенной(абсолютная легендарка 10 звёзд) M💞riko


### Installation

```shell
   pip install morilint
```
или укажите специфическую версию, в примере версия 0.1.5
```shell
  pip install morilint==0.1.5
```

### Lint message
Для проверки сообщения нужно использовать класс `MoriLinter`
```python3
from morilint import MoriLinter
from morilint.typing import LintResponse


# Создаем экземпляр линтера
linter = MoriLinter()

# Выполняем проверку сообщения
lint_result: LintResponse = linter.lint(
    message="""
Доброй доброй ночки
Ты микрокот милый и мелкий 

Добрая, умная, весёлая и такая хорошенькая (добавляешь сахарность
(или как там было с овсянкой) в мою жизнь ☃️)
Очень ценю тебя, искренне считаю тебя особенной и очень красивой!!!!1!1 
люблю смотреть на тебя 💜
Сладких снов, высыпайся, завтра червячки

Ты самая лучшая ❤️
"""
)

# Вывод результата на экран
print(lint_result)
```

### Configure Linter

Для детальной настройки линтера вы можете создать экземпляр класса `LintConfig` и указать нужные вам значения 
соответствующих параметров. Далее созданный экземпляр класса `LintConfig` просто передайте как параметр `config` 
при создании экземпляра класса MoriLinter.

```python3
from morilint import MoriLinter, LintConfig
from morilint.typing import LintResponse


config = LintConfig(
    check_length=False,  # линтер не будет проверять соответствие длинны сообщения
)

# Создаем экземпляр линтера
linter = MoriLinter(config=config)

# Выполняем проверку сообщения
lint_result: LintResponse = linter.lint(
    message="""
Доброй доброй ночки ⛄✨

Спи хорошенько, ты ведь сама такая хорошенькая 🥰

Отлично поиграли, нафармили 🌸
- много олова
- много железа(многа арехав)
С тобой очень хорошо, ты даришь много позитивных эмоций и наполняешь своей милотой

Мне нравится смотреть на тебя, слушать тебя, проводить время вместе, 
делать что-то для тебя 🌼💜

Ты такая красивая просто 💖
И ещё ты самая лучшая девочка ❤️
"""
)

# Вывод результата на экран
print(lint_result)
```

Теперь у вас не будет отображаться ошибка проверки длины, как в первом примере.
Весь список доступных параметров и то, за что они отвечают можно просмотреть в разделе
с [документацией к LintConfig](#lintconfig)

### Lint Files

Если вам необходимо проверить множество сообщений из файлов, для этого вы можете использовать как класс
`MoriFileLinter` внутри вашей программы, так и воспользоваться запуском проверки через консоль.
Здесь будет показано, как запустить проверку через консоль, детальная информацию о возможностях класса
можно прочитать в разделе [с документацией к MoriFileLinter](#morifilelinter)

Для запуска проверки файлов через консоль, достаточно ввести команду

```shell
morilint .
```
После чего в текущей директории будут проверены все файлы с расширением `.mori`.

Пример директории:

```
.venv/
main.py
message_1.mori
message_2.mori
```

В результате в консоле будет выведен отчёт о проверке.


### Configure File Linter

Также при запуске возможно передать флаги для настройки линтера.
Вот пример команды с указанием настроек.

```shell
morilint . --message_length 15 --min_hearts_count 2 --req_keywords "Word1,word2" --hearts "❤️,💖,💘" --check_length --no-check_keyword --check_hearts
```
Описание параметров:

`--message_length` - Максимальная длина сообщения

`--min_hearts_count` - Минимальное количество сердечек

  `--req_keywords` - Список обязательных ключевых слов, разделённых запятыми

  `--hearts HEARTS` - Список эмодзи сердечек, разделённых запятыми

  `--check_length` - Включить проверку длины

  `--no-check_length` - Отключить проверку длины

  `--check_keyword` - Включить проверку ключевых слов

  `--no-check_keyword` - Отключить проверку ключевых слов

  `--check_hearts` - Включить проверку сердечек

  `--no-check_hearts` - Отключить проверку сердечек

Также для просмотра информации о параметрах можно использовать команду

```shell
morilint --help
```

### LintConfig

Основной класс с конфигурацией линтера. Реализует интерфейс `ILintConfig`

Параметры:

`message_length: int` - минимально допустимый размер сообщения(в отдельных словах), по умолчанию 30

`req_keywords: list[str]` - список ключевых слов, хотя-бы одно из которых должно быть в сообщении.

`hearts: frozenset[str]` - множество сердечек, сообщение будет проверяться на наличие сердечек из этого множества, если проверка сердечек включена.

`min_hearts_count: int` - минимальное число сердечек, которое должно быть в сообщении, если включена соответствующая проверка.

`check_length: bool` - флаг проверки длины сообщения, по умолчанию включен 

`check_keyword: bool` - флаг проверки наличия ключевых слов в сообщении, по умолчанию включен 

`check_hearts: bool` - флаг проверки сердечек в сообщении, по умолчанию включен 

### MoriLinter

Основной класс работы с линтером.

В инициализатор принимает опциональный параметр:
- `config: LintConfig` - конфигурация линтера, если не будет передан, то будет использоваться конфигурация по умолчанию

**Метод** `lint(self, message: str) -> LintResponse`

Метод принимает исходное сообщение, которое необходимо проверить.

Возвращает экземпляр класса `LintResponse`.

Класс `LintResponse` содержит следующие атрибуты: 
- `total_checks: int` - сколько всего проверок было запущено
- `success: int` - сколько успешных проверок
- `fail: int` - сколько неуспешных проверок
- `failed_checks_detail: list[str]` - список строк, с детальным описанием каждой найденной проблемы.

### MoriFileLinter

Класс созданный специально для проверки текста сообщений из файлов.

Работает с файлами с расширением `.mori`

В инициализатор принимает 1 параметр:
- `config: LintConfig` - конфигурация линтера, если не будет передан, то будет использоваться конфигурация по умолчанию

**Метод** `lint(self, directory: str, print_lint_result: bool = True) -> LintFilesResponse`

Принимает параметры:
- `directory: str` - имя директории, в которой необходимо проверить файлы
- `print_lint_result: bool = True` - флаг, отвечающий за то, будет ли выводиться в консоль результат проверки, по умолчанию True

**Возвращает** экземпляр класса `LintFilesResponse` с атрибутами:
- `total_files_checked: int` - общее число проверенных файлов
- `checked_filenames: list[str]` - список с названиями проверенных файлов
- `problems_found: int` - сколько проблем найдено во всех файлах в сумме
- `success: int` - сколько файлов прошли проверки
- `failed: int` - сколько файлов не прошли проверки
- `detail: list[LintFileData]` - список из экземпляров класса `LintFileData` - здесь содержится информация 
об имени файла и данные о проверке файла

