/YP

Primary LanguagePythonMIT LicenseMIT

Задача Yandex.Практикум

Привет всем! Тут Я.Практикум предложил сделать для них задание. Дедлайны, увы, я нарушил, но все равно сделал эту работу с удовольствием.

Итак, с самой задачей можно ознакомиться здесь. Врум, врум, поехали... :)

Основной скрипт

Склонируйте текущий репозиторий https://github.com/Sam1808/YP.git.

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

pip install -r requirements.txt

Запуск расчета стоимости доставки

Из задания я не смог сделать однозначный вывод, будет ли его использовать сам пользователь, или это будет частью чего то большого. Поэтому принял решение добавить простейший CLI интерфейс - пользовать приятно, да и части ошибок можно избежать.

Запустите python main.py -h для получения справки по аргументам командной строки. Вывод:

usage: main.py [-h] -d DELIVERY [-p PRICE] [-l LOAD] [-o IS_OVERSIZED] [-f IS_FRAGILE]

Please fill options for delivery

options:
  -h, --help            show this help message and exit
  -d DELIVERY, --delivery DELIVERY -> Specify the delivery distance
  -p PRICE, --price PRICE -> Add minimal delivery price (default 400)
  -l LOAD, --load LOAD -> Specify current service load (very high, high or increase)
  -o IS_OVERSIZED, --is_oversized IS_OVERSIZED -> Is cargo oversized (default False)
  -f IS_FRAGILE, --is_fragile IS_FRAGILE -> Is cargo fragile (default False)

Подробнее про опции

  • python main.py -d 5 - Расчет стоимости доставки на 5 км при прочих значениях по умолчанию. Параметр -d обязательный. Скрипт сообщит об ошибке, если вы его не укажите error: the following arguments are required: -d/--delivery

  • python main.py -d 5 -l 'very high load' - Расчет стоимости доставки на указанное расстояние с учетом загруженности сервиса, которая определяется по ключевым словам: very high - очень высокая загруженность, коэффициент стоимости 1.6, high - высокая загруженность, коэффициент стоимости 1.4, increase - повышенная загруженность, коэффициент стоимости 1.2. По умолчанию загруженности нет.

  • python main.py -d 5 -o True - Расчет стоимости доставки на указанное расстояние с учетом габаритов груза, где False (по умолчанию) груз обычный, а True груз габаритный.

  • python main.py -d 5 -f True - Расчет стоимости доставки на указанное расстояние с учетом хрупкости груза, где False (по умолчанию) груз НЕ хрупкий, а True груз хрупкий.

  • python main.py -d 5 -p 1000 - Расчет стоимости доставки на указанное расстояние с учетом изменения минимальной цены доставки (в текущем примере 1000). Значение по умолчанию равно 400, согласно условии задачи. Этот функционал выходит за рамки задания, ну да ладно, решил добавить пользователю лишнюю возможность.

Пример

Расчет доставки габаритного, хрупкого груза, на расстояние 15 км при повышенной загруженности сервиса:

python main.py -d 15 -o True -f True -l 'increase'

Результат

Результатом выполнения будет стоимость доставки выраженная числом в формате float или результат None, если есть неприемлемые условия расчета. Примеры:

python main.py -d 15 -o True -f True -l 'increase'
1320.0
python main.py -d 150 -f True
None

Автотесты

Согласно заданию необходимо покрыть код автотестами, чтож сделаем это с помощью pytest и оформим все тесты отдельно как файл test.py.

Запуск тестов pytest test.py, я ограничился 24 тестами, покрывающих основной функционал, но понятно, что нет предела совершенству.

Я сдобрил тесты огромным количеством комментариев, наверное даже излишним количеством. Но тут скорее пусть они будут, чем не будут.

Устные вопросы

Попросили отдельно в Текстовом формате ответить на вопросы. Что ж вот файл с ответами qa.md, надеюсь формат соответствует.

Лирические вопросы

И все таки я не понял из задания (на эти вопросы не обязательно отвечать :)):

  • Условие - большие габариты: +200 рублей к доставке; - маленькие габариты: +100 рублей к доставке. В целом определения "большие" и "маленькие" уже спорно, ещё больше удивляет, что любые габариты увеличивают стоимость.

  • Условие Минимальная сумма доставки — 400 рублей. Если сумма доставки меньше минимальной, выводится минимальная сумма. В целом невозможная ситуация, поскольку в задаче есть только повышающие коэффициенты.