SUAI-TaskPlanner-Contest / TaskPlanner

Client application for working with todos and syncing with CalDAV servers
MIT License
3 stars 2 forks source link

Создать CalDAV сервис задач #37

Closed Lailes closed 1 year ago

Lailes commented 1 year ago

Developing Task

Требования: программист

Краткое описание

В рамках данной задачи необходимо создать сервис, который будет агрегировать в себе всю работу с CalDAV протоколом, скрывая её от других частей системы

Функциональные требования или документация

Конструктор данного класса:

Контекст работы класса

Данный класс работает с классом задачи:

class Task:
     Title: str
     Text: str
     CreationTime: time
     Labels: list[str]
     Path: str

Список методов:

  1. Получение задач из календаря c поиском ID

    • Входные параметры:
      • id: int - получение задачи c переданным ID и подзадач
    • Выходные параметры:
      • list[Task]
  2. Получение множества задач из календаря c поиском ID

    • Входные параметры:
      • ids: list[int] - получение задач c переданными ID и подзадач
    • Выходные параметры:
      • list[Task]
  3. Получение задач из календаря с поиском Name

    • Входные параметры:
      • name: str - получение задачи c переданным Name и подзадач
    • Выходные параметры:
      • list[Task]
  4. Получение задач из календаря с поиском Path

    • Входные параметры:
      • path: str - получение задач, по всему пути
      • ascending: bool - получение задач вверх по пути или вниз от задачи
    • Выходные параметры:
      • list[Task]
  5. Получение всех задач из календаря

    • Входные параметры: -
    • Выходные параметры:
      • list[Task]
  6. Получение конкретной задачи по ID

    • Входные параметры:
      • id: int
    • Выходные параметры:
      • Task | None
  7. Получение конкретной задачи по Названию

    • Входные параметры:
      • name: str
    • Выходные параметры:
      • Task | None
  8. Удаление конкретной задачи по Названию

    • Входные параметры:
      • name: str
      • recursive: bool - удалить подзадачи или нет
    • Выходные параметры:
      • bool - было произведено удаление, или нет
  9. Удаление конкретной задачи по ID

    • Входные параметры:
      • id: int
      • recursive: bool - удалить подзадачи или нет
    • Выходные параметры:
      • bool - было произведено удаление, или нет
  10. Создание задачи

    • Входные параметры:
      • task: Task - объект задачи
      • replace: bool стоит ли заменять задачу, если такая задача уже есть
        • Выходные параметры:
      • bool - была ли задача создана
  11. Обновление задачи

    • Входные параметры:
      • task: Task - объект задачи
        • Выходные параметры:
      • bool - была ли задача обновлена

Обобщенное решение

  1. Создать класс, реализующий описанную выше функциональность
  2. Поднять caldav сервер в docker
  3. Написать unit-тесты, проверяющее работу сервиса

Выходной результат

  1. Проект unit-тестов
  2. Класс caldav сервиса, с комментариями
Lailes commented 1 year ago

@astronik00 провалидируй пожалуйста задачу. Есть сомнения на счет последних двух пунктов

Lailes commented 1 year ago

@astronik00 провалидируй пожалуйста задачу. Есть сомнения на счет последних двух пунктов

Класс задачи в примере скорее всего измениться, конечно

astronik00 commented 1 year ago

@Lailes

У тебя в классе Task атрибутов уже меньше, чем определила Саша, надо иметь в виду, что это изменится

astronik00 commented 1 year ago

Конструктор данного класса:

  • URL календаря
  • Аутентификационные данные

Может, стоит сразу передавать сущность principal, которая и приходит в конструктор? Разве не странно будет, если в конструкторе будет находиться следующий код?

with caldav.DAVClient(url=url, username=username, password=password) as client:
    my_principal = client.principal()

Билдить это в другом месте?..

astronik00 commented 1 year ago

Получение всех задач из календаря

Может, во входных данных тоже None написать?

astronik00 commented 1 year ago

Создать класс, реализующий описанную выше функиональность

Опечатка

Lailes commented 1 year ago

Получение всех задач из календаря

Может, во входных данных тоже None написать?

В данных примерах нет опциональных параметров, пока что

Lailes commented 1 year ago

@Lailes

У тебя в классе Task атрибутов уже меньше, чем определила Саша, надо иметь в виду, что это изменится

Да, понимаю это

Lailes commented 1 year ago

Конструктор данного класса:

  • URL календаря
  • Аутентификационные данные

Может, стоит сразу передавать сущность principal, которая и приходит в конструктор? Разве не странно будет, если в конструкторе будет находиться следующий код?

with caldav.DAVClient(url=url, username=username, password=password) as client:
    my_principal = client.principal()

Билдить это в другом месте?..

Principal это часть библиотеки CalDAV протокола. Иными словами, библиотека CalDAV будет использоваться вне этого класса работы с CalDAV, что не есть очень хорошо. Так выйдет, что часть логики работы с CalDAV будет вне этого сервиса

astronik00 commented 1 year ago

Principal это часть библиотеки CalDAV протокола. Иными словами, библиотека CalDAV будет использоваться вне этого класса работы с CalDAV, что не есть очень хорошо. Так выйдет, что часть логики работы с CalDAV будет вне этого сервиса

Ты имеешь в виду, чтобы вся-вся логика находилась внутри этого сервиса?

Lailes commented 1 year ago

Principal это часть библиотеки CalDAV протокола. Иными словами, библиотека CalDAV будет использоваться вне этого класса работы с CalDAV, что не есть очень хорошо. Так выйдет, что часть логики работы с CalDAV будет вне этого сервиса

Ты имеешь в виду, чтобы вся-вся логика находилась внутри этого сервиса?

Да, именно. Чтобы библиотека CalDAV не использовалась нигде вне этого сервиса

astronik00 commented 1 year ago

Я не совсем это имела в виду. Я имела в виду вынести строку подключения в какой-нибудь класс ConnectionBuilder, который бы уже вызывал твой сервис

Lailes commented 1 year ago

Я не совсем это имела в виду. Я имела в виду вынести строку подключения в какой-нибудь класс ConnectionBuilder, который бы уже вызывал твой сервис

Понял идею. Мне пока не совсем ясно какие плюсы у такого решения. Но я думаю, что такое сделать не составит труда

astronik00 commented 1 year ago

@Lailes А где будут методы типа pushAll, pushSelected?

Получается, исходя из твоей версии, функция добавления должна принимать *tasks

Lailes commented 1 year ago

@Lailes А где будут методы типа pushAll, pushSelected?

Получается, исходя из твоей версии, функция добавления должна принимать *tasks

Я думал, что все будет по отдельности... В сервисе выше. А этот работает при отдельных задачах. Этот будет делать все по отдельности, ради простоты. Если надо будет, могу дополнить методами для работы с несколькими задачами. Но не ясно, позволяет ли это калдав делать

astronik00 commented 1 year ago

@Lailes А где будут методы типа pushAll, pushSelected? Получается, исходя из твоей версии, функция добавления должна принимать *tasks

Я думал, что все будет по отдельности... В сервисе выше. А этот работает при отдельных задачах

А разве не проще тогда сделать просто функцию, которая принимает множество аргументов *tasks? И одну задачу можно добавить, и несколько.

Edit: Действительно, надо проверить сперва, позволяет ли это caldav

Lailes commented 1 year ago

@Lailes А где будут методы типа pushAll, pushSelected? Получается, исходя из твоей версии, функция добавления должна принимать *tasks

Я думал, что все будет по отдельности... В сервисе выше. А этот работает при отдельных задачах

А разве не проще тогда сделать просто функцию, которая принимает множество аргументов? И одну задачу можно добавить, и несколько.

Edit: Действительно, надо проверить сперва, позволяет ли это caldav

Думаю, если что можно просто сделать в цикле :)

astronik00 commented 1 year ago

@Lailes А где будут методы типа pushAll, pushSelected? Получается, исходя из твоей версии, функция добавления должна принимать *tasks

Я думал, что все будет по отдельности... В сервисе выше. А этот работает при отдельных задачах

А разве не проще тогда сделать просто функцию, которая принимает множество аргументов? И одну задачу можно добавить, и несколько. Edit: Действительно, надо проверить сперва, позволяет ли это caldav

Думаю, если что можно просто сделать в цикле :)

да, также подумала 👍

astronik00 commented 1 year ago

@Lailes А может unit тесты вынести в отдельную задачу?

astronik00 commented 1 year ago

@Lailes

Удаление конкретной задачи по ID

Мы решили удалить в любом случае все подзадачи, потому что иначе нужно делать сложные операции по перестраиванию дерева

Lailes commented 1 year ago

@Lailes

Удаление конкретной задачи по ID

Мы решили удалить в любом случае все подзадачи, потому что иначе нужно делать сложные операции по перестраиванию дерева

Понял 👌🏻 Так будет куда проще

Lailes commented 1 year ago

@Lailes А может unit тесты вынести в отдельную задачу?

Мне кажется что не стоит. Юнит тесты это как критерий прохождения качества кода, который будет написан в рамках этой задачи. Но юнит тесты это громко сказано. Вероятно проще сделать консольное приложение (все равно интегрировать с GitHub CI нельзя будет). Как ты думаешь, стоит делать их?

astronik00 commented 1 year ago

@Lailes А может unit тесты вынести в отдельную задачу?

Мне кажется что не стоит. Юнит тесты это как критерий прохождения качества кода, который будет написан в рамках этой задачи. Но юнит тесты это громко сказано. Вероятно проще сделать консольное приложение (все равно интегрировать с GitHub CI нельзя будет). Как ты думаешь, стоит делать их?

Что ты имеешь в виду под консольным приложением?

Lailes commented 1 year ago

@Lailes А может unit тесты вынести в отдельную задачу?

Мне кажется что не стоит. Юнит тесты это как критерий прохождения качества кода, который будет написан в рамках этой задачи. Но юнит тесты это громко сказано. Вероятно проще сделать консольное приложение (все равно интегрировать с GitHub CI нельзя будет). Как ты думаешь, стоит делать их?

Что ты имеешь в виду под консольным приложением?

Я думал, что можно создать по юнит тесту на каждый метод. Но можно просто создать файл питона, который запускается в консоли, и показывает как что используется

astronik00 commented 1 year ago

@Lailes А может unit тесты вынести в отдельную задачу?

Мне кажется что не стоит. Юнит тесты это как критерий прохождения качества кода, который будет написан в рамках этой задачи. Но юнит тесты это громко сказано. Вероятно проще сделать консольное приложение (все равно интегрировать с GitHub CI нельзя будет). Как ты думаешь, стоит делать их?

Что ты имеешь в виду под консольным приложением?

Я думал, что можно создать по юнит тесту на каждый метод. Но можно просто создать файл питона, который запускается в консоли, и показывает как что используется

Все еще не понимаю, что ты имеешь в виду под консольным приложением. Юнит тесты звучат как нормальная идея

Lailes commented 1 year ago

@Lailes А может unit тесты вынести в отдельную задачу?

Мне кажется что не стоит. Юнит тесты это как критерий прохождения качества кода, который будет написан в рамках этой задачи. Но юнит тесты это громко сказано. Вероятно проще сделать консольное приложение (все равно интегрировать с GitHub CI нельзя будет). Как ты думаешь, стоит делать их?

Что ты имеешь в виду под консольным приложением?

Я думал, что можно создать по юнит тесту на каждый метод. Но можно просто создать файл питона, который запускается в консоли, и показывает как что используется

Все еще не понимаю, что ты имеешь в виду под консольным приложением. Юнит тесты звучат как нормальная идея

Просто по сути скрипт, с примерами использования класса, который работает CalDAV сервером. Юнит тесты тоже хорошая идея, они делают тоже самое

astronik00 commented 1 year ago

Image

Lailes commented 1 year ago

Необходимо предусмотреть открытие несуществующего календаря, сделав его создание как поведение по умолчанию