Skip to main content

Tools for creating functions

Project description

function-tools - это библиотека вспомогательных классов для реализации Функций системы.

Договоримся

Необходимо различать функции - объект Python и бизнес-функцию. В тех местах, где речь будет вестить про Python-функции - они будут написаны с маленькой буквы - функции, про бизнес-функции с большой буквы - Функции. Если абстрагироваться, то система - хранилище данных и функционал, который каким-то образом изменяет данные, при этом достигая ожидаего результата описанного в бизнес требованиях. Таким образом, Функции - это ядро системы и необходимо уделять пристальное внимание тому, как Функции реализованы в системе.

В большинстве случаев Функции имеют следующие признаки:

  • Реализованы в виде функций длинной не влазящик ни в один экран монитора;
  • Имеют запутанный код с множеством условных конструкций (умеренное количество допустимо);
  • Взаимодействие с базой данных выстроено таким образом, как будто вся база данных хранится в оперативной памяти и нет необходимости заботиться о количестве запросов и их оптимальности;
  • Наименование функций и названий переменных сокращено настолько, что для понимания кода иногда не хватает простого прочтения и возникает необходимость дебага. Часто это дополнятся размером функций, когда в середине не помнишь, что было в начале.
  • Высокая когнитивная нагрузка связанная со сложностью реализации и правилами, для которых нет описания, но они имеют фундаментальное значение в работе Функций.
  • Низкий уровень самодокументируемости кода из-за плохой его декомпозиции;
  • Перегруженность функций действиями, которые являются вспомогательными и никак не отражают реализованные бизнес требования.
  • Отсутствие валидации входных данных и данных при выполнении функции, что позволяет потенциально испортить данные;
  • Кеширование данных для работы функции часто замешано код функции;
  • Большая вариативность реализаций Функций, что не позволят однозначно найти причину ошибки при ее возникновении в виде Инцидента или Бага (если конечно не сам сегодня эту ошибку совершил).

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

Упрощенная диаграмма классов представлена на Рисунке 1.

Рисунок 1

Основные компоненты:

Cache

Кеш объектов некоторой указанной сущности. Служит для однократной выборки данных и дальнейшего их использования в рамках функции (Function).

StorageCache

Хранилище кешей. Состоит из кешей и используется для более удобного хранения и доступа к ним.

Helper

Помощник запускаемого объекта. Содержит вспомогательные функции, кеш.

Validator

Валидатор данных. Имеется у Пускателя и Функции.

Function

Функция, приближенная к бизнес-функции. Имеет помощника и выполняет действия согласно безнес требований.

Runner

Пускатель. Умеет запускать как одинчные функции, так и цепочные функции представленные в виде пускателей.

RunnerManager

Менеджер пускателя. Отвечает за создание функций и пускателей и дальнейший их запуск.

Error

Ошибка, возникающая в процессе работы.

Result

Результат исполнения запускаемого объекта.

ResultPresenter

Презентер результата исполнения запускаемого объекта. Данные компоненты позволяют распределить обязанности и, таким образом существенно снизить когнитивную нагрузку при анализе кода. При понимании работы механизма, можно без особых усилий локализовывать возникающие ошибки и иправлять их. Код становится самодокументируемым и возникает необходимость описания только основополагающих концепций и подходов к реализации требуемого функционала.

Алгоритм работы Функции выглядит следующим образом:

  • Создается пускатель;
  • Создаются функции и пускатели, которые добавляются в очередь на исполнение пускателю;
  • Функции и пускатели создают помощников, которые в свою очередь создают хранилища кешей;
  • Перед запуском выполняемых объектов производится валидация на уровне пускателя;
  • Производится запуск функций;
  • После завершения работы выполняемых объектов и, соответственно, пускателя, производится вывод результата работы пользователю в необходимом виде.

Подробная актуальная диаграммка классов представлена на Рисунке 2.

Рисунок 2

С подробной документацией можно ознакомиться на function-tools.readthedocs.io

История изменений

0.3.7

  • EDUSCHL-14355 Добавление on_delete в модель Entity.

0.3.6

  • EDUSCHL-18158 Исправление шаблонов для поиска модулей с сущностями function_tools.

0.3.5

  • EDUSCHL-18043 Убрано дефолтное значение параметра strategy команды startfunction.

0.3.4

  • EDUSCHL-18043 Наполнение стратегий реализаций функций перенесено в команду, его использующую.

0.3.3

  • EDUSCHL-17752 Добавление обработчика сигнала function_tools_after_migrate_receiver вызываемого после прогона миграций;
  • EDUSCHL-17752 Добавление методов для формирования карт соответствия менеджеров и запускаемых объектов.

0.3.2

  • EDUSCHL-17752 Исправление ошибки с работой с путями.

0.3.1

  • EDUSCHL-17752 Исправление ошибки с работой с путями.

0.3.0

  • EDUSCHL-17752 Добавлена единая модель для регистрации сущностей в базе данных;
  • EDUSCHL-17752 В ранер добавлен метод _populate_queue_by_runnable_classes запускаемый при инициализации и добавляющий запускаемые объекты в очередь;
  • EDUSCHL-17752 Добавлена команда register_entities для регистрации сущностей в БД;
  • EDUSCHL-17752 Verbose_name и tags сущностей преобразованы в методы и свойства классов. Здесь могут быть проблемы с совместимостью;
  • EDUSCHL-17752 Внесены изменения в шаблон Функции;

0.2.6

  • EDUSCHL-17752 Убран вывод ошибки, чтобы не вводить в заблуждение;
  • EDUSCHL-17752 Добавление докстрингов.

0.2.5

  • EDUSCHL-17752 В шаблон функции в apps.py добавлен verbose_name и заменен label;
  • EDUSCHL-17752 Добавление хранилища кешей с возможностью патчинга при назначении глобального хелпера.

0.2.4

  • EDUSCHL-17935 Преобразование функции регистрации Функций системы в команду.

0.2.3

  • EDUSCHL-17752 Временный фикс ошибки импорта модулей со стратегиями.

0.2.2

  • EDUSCHL-17810 Исправление ошибки при первом прогоне миграций.

0.2.1

  • EDUSCHL-17810 Исправление MANIFEST.in для добавления шаблонов файлов в пакет;
  • EDUSCHL-17810 Исправление ошибки при первом прогоне миграций.

0.2.0

  • EDUSCHL-17810 Восстановление сборки документации;
  • EDUSCHL-17810 Понижение версии Django до 1.11.29;
  • EDUSCHL-17810 Добавление шаблона функции;
  • EDUSCHL-17810 Добавление примера;
  • EDUSCHL-17810 Добавление возможности постановки в очередь сразу нескольких запускаемых объектов.

0.1.19

  • BOBUH-19996 Добавлена возможность обновлять очередь ранера "на ходу"
  • BOBUH-19996 Добавлена возможность принимать результат предыдущего ранера в текущем в цепочке запуска
  • BOBUH-19996 Добавлен базовый класс функции с примесью глобального помощника

0.1.18

  • Исправление ошибки перепривязки идентификаторов значений внешних ключей.

0.1.17

  • Добавление миграции, в связи с изменениями в m3-db-utils.

0.1.16

  • Добавление недостающих файлов в MANIFEST.in.

0.1.15

  • BOBUH-18883 Исправление ошибки с формированием сообщения об ошибке.

0.1.14

  • BOBUH-18886 Исправлены все орфографические ошибки в проекте;
  • BOBUH-18886 Удалены неиспользуемые методы init в шаблонах функций;
  • BOBUH-18372 Доработки функции генерации исходного кода функций;
  • BOBUH-18372 Добавление логики поиска шаблонов функций с указанием их имени в стратегии реализации функций;
  • BOBUH-18372 Исправление ошибки с отсутствующим запуском валидации при использовании небазового ранера;

0.1.13

  • BOBUH-18382 Исправление ошибки object.init() takes no parameters вызванной множественным наследованием;
  • BOBUH-18382 Исправление опечаток.

0.1.12

  • BOBUH-18382 Преобразование перечисления со стратениями создания функци в модель-перечисление для дальнейшего расширения из продуктов;
  • BOBUH-18382 Рефакторинг;
  • BOBUH-18382 Добавление зависимости m3_db_utils;
  • BOBUH-18382 Исправление ошибки с неверным проставлением глобального помощника;
  • BOBUH-18382 Работа с результатом приведена к единому виду с остальными сущностями для более удобного расширения поведения;
  • BOBUH-18382 Расширена логика создания помощника и валидатора с использованием базовых классов;
  • BOBUH-18382 Добавлены результаты работы ранера и функции в шаблон генерируемой функции.

0.1.11

  • BOBUH-18382 Добавление классов помощников и валидаторов по умолчанию.

0.1.10

  • BOBUH-18382 Доработка шаблона actions.py-tpl для более удобной расширяемости при наследовании;
  • BOBUH-18382 Добавление модуля для перечислений в шаблон функции;
  • BOBUH-18382 Добавление методов получения классов помощника и валидатора функции для дальнейшего более удобного расширения при наследовании;
  • BOBUH-18382 Доработка шаблона actions.py-tpl для более удобного дальнейшего расширения поведения;
  • BOBUH-18382 Добавление точек расширения у базового помощника;
  • BOBUH-18382 Добавление точки расширения менеджера;
  • BOBUH-18382 Добавление точек расширения в миксины помощника, валидатора, глобального помощника;
  • BOBUH-18382 Доработка шаблона синхронной функции.

0.1.9

  • BOBUH-18362 Добавление тегов в зарегистрированную функцию;
  • BOBUH-18362 Дополнен шаблон actions.py;
  • BOBUH-18382 Выделение дополнительных точек расширения поведения менеджера ранера и запускаемых объектов.

0.1.8

  • Добавление регистрации функции системы в БД;
  • Реализован генератор функции.

0.1.7

  • Поднятие версии Django.

0.1.6

  • Добавлена возможность установки собственного результата ранера.

0.1.4

  • Добавление MANIFEST.in для корректной сборки и дальнейшей установки пакета;

0.1.3

  • Добавление возможности выполнения отложенного сохранения объектов, даже в случае наличия ошибок в процессе работы функции;
  • Добавление свойств helper и global_helper в соответствующие миксины;
  • Добавлена возможность расширения запускаемого объекта перед и после валидации;
  • Добавлен декоратор для методов функции, запускаемых только в случае отсутствия зарегистрированных ошибок, полученных в процессе работы функции.

0.1.2

  • Поднята версия Django до 2.2.4

0.1.1

  • Добавление ссылок на документацию.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

function-tools-0.3.7.tar.gz (42.9 kB view hashes)

Uploaded Source

Built Distribution

function_tools-0.3.7-py3-none-any.whl (56.9 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page