|
1 | 1 | # Версионирование правил КД2 |
2 | 2 |
|
3 | | -Разбор для версионирования в гит правил конвертации, правил регистрации в удобочитаемом виде. |
| 3 | +Разбор правил конвертации, правил регистрации в читаемом и удобном для анализа виде для хранения и версионирования в GIT. |
| 4 | + |
| 5 | + |
| 6 | +## Как пользоваться |
| 7 | + |
| 8 | +1. Ручной разбор правил (команда `rulexport export`) |
| 9 | +2. Автоматический разбор в гит-репозитории (команда `rulexport install`) |
| 10 | + |
| 11 | +### Ручной разбор правил: |
| 12 | +Выполняет разбор произвольного файла командой |
| 13 | +``` |
| 14 | +rulexport export |
| 15 | + --schema=ИмяФайлаСхемы.json |
| 16 | + --path=ПапкаРазбора |
| 17 | + ИМЯ_ФАЙЛА_ПРАВИЛ.xml |
| 18 | +``` |
| 19 | + |
| 20 | +### Автоматический разбор правил: |
| 21 | +Выполняет разбор с помощью хука `pre-commit` всех файлов КД2 добавленных индекс гит-репозитория. |
| 22 | +Хук устанавливается в репозиторий командой: |
| 23 | +``` |
| 24 | +rulexport install |
| 25 | + --schema=ИмяФайлаСхемы.json |
| 26 | + --src=ПапкаРазбора |
| 27 | + ПУТЬ_К_РЕПОЗИТОРИЮ |
| 28 | +``` |
| 29 | + |
| 30 | +*Особенности работы хука:* |
| 31 | +- Выполняет разбор только тех файлов, которые являются файлами КД2, которые добавлены в индекс. |
| 32 | +- Если файл добавлен в индекс и имеет изменения вне индекса, то будет выдано исключение. |
| 33 | +- Вне индекса файлы не обрабатываются. |
| 34 | +- Если файл правил удаляется или переименовывается, то соотвествующая ему папка с разобранными правилами удаляется. |
| 35 | + |
| 36 | +## Что такое СХЕМА и как это работает? |
| 37 | + |
| 38 | +Алгоритм выполняет обработку правил согласно схемы. |
| 39 | +По задумке модификацию разбора правил, добавления обработки дополнительных узлов можно производить только изменяя файл схемы `schema.json` не модифицируя код алгоритма. |
| 40 | + |
| 41 | +Алгоритм рекурсивно обходит структуру схемы и выполняет действия каждого "узла". |
| 42 | + |
| 43 | +*Узел схемы влючает в себя следующие поля:* |
| 44 | +- `Область` - произвольное описание действия (не используется в алгоритмах) |
| 45 | +- `ИмяПапки` - создает папку, в которую помещает результат обработки узла |
| 46 | +- `Совпадения` - поиск совпадений Regex (коллекция) в тексте итерации. |
| 47 | +- `ИменованныеГруппы` - имена именованных групп `Совпадения`, которые будут использованы для автозамены в полях `ЗаменитьНа` и `ИмяФайла` текста "<ИмяГруппы>" за значение из найденного совпадения |
| 48 | +- `ЗаменитьНа` - выражение для замены совпадения (использует автоподставновку именованных групп) |
| 49 | +- `ИмяФайла` - имя файла, в который будет сохранен каждый элемент коллекции совпадений (использует автоподставновку именованных групп) |
| 50 | +- `ИмяПапкиПодчиненных` - создает папку для каждого элемента `Совпадения` (использует автоподставновку именованных групп текущего узла). Дополняет путь `ИмяПапки`, может использоваться как вместо, так и вместе с `ИмяПапки`. Пример, когда может понадобиться данное поле - создание папок для каждого ПКО с вложенными файлами свойств и т.п. |
| 51 | +- `ПодчиненныеЭлементы` - массив подчиненных узлов |
| 52 | + |
| 53 | + В текущей реализации схема копируется в репозиторий. Для каждого репозитория можно использовать свою схему. |
| 54 | +## Почему не другие готовые решения? |
| 55 | + |
| 56 | +Целью решения было нахождение баланса между "версионируем файл целиком" и "версионируем каждый узел как отдельный файл". |
| 57 | +Оба варианта имеют недостатки. |
| 58 | +В первом случае проблемой является изменение порядка узлов. |
| 59 | +Во втором - слишком большое количество мелких файлов, глубина иерархии, длинные пути |
| 60 | + |
| 61 | +Предлагаемый способ хранения (согласно дефолтной схеме) в виде дерева: |
| 62 | +``` |
| 63 | +│ НашиПравилаКонвертации.xml |
| 64 | +├───Алгоритмы |
| 65 | +│ │ Алгоритмы.xml |
| 66 | +│ └───Алгоритмы |
| 67 | +│ Алгоритм-ВыгрузитьОстаткиМатериалов.xml |
| 68 | +│ Алгоритм-ВыгрузитьОстаткиНоменклатурыПоСчету.xml |
| 69 | +│ Алгоритм-ВыгрузитьОстаткиТМЦвЭксплуатации.xml |
| 70 | +│ Алгоритм-ВыгрузитьОстаткиТоваров.xml |
| 71 | +├───Запросы |
| 72 | +│ │ Запросы.xml |
| 73 | +│ └───Запросы |
| 74 | +│ Запрос-ОстаткиМатериалов.xml |
| 75 | +│ Запрос-ОстаткиОС.xml |
| 76 | +├───Общее |
| 77 | +│ ПередВыгрузкойДанных.xml |
| 78 | +│ ПередЗагрузкойДанных.xml |
| 79 | +│ ПередКонвертациейОбъекта.xml |
| 80 | +│ ПослеЗагрузкиДанных.xml |
| 81 | +│ ПослеЗагрузкиПараметров.xml |
| 82 | +│ ПослеЗагрузкиПравилОбмена.xml |
| 83 | +├───Параметры |
| 84 | +│ Параметры.xml |
| 85 | +├───ПравилаВыгрузкиДанных |
| 86 | +│ ПВД-Банки.xml |
| 87 | +│ ПВД-БанковскиеСчета.xml |
| 88 | +│ ПВД-Валюты.xml |
| 89 | +└───ПравилаКонвертацииОбъектов |
| 90 | + │ ПравилаКонвертацииОбъектов.xml |
| 91 | + └───Правила |
| 92 | + ПКО-АвансовыйОтчет.xml |
| 93 | + ПКО-Банки.xml |
| 94 | + ПКО-Валюты.xml |
| 95 | + ПКО-ВводОстатков.xml |
| 96 | +``` |
| 97 | +Основной принцип: |
| 98 | +в исходном тексте удаляются (заменяются) `Совпадения` и сохраняются в файл `ИмяФайла`. |
| 99 | +Получаем на верхних уровнях файлы-оглавления, в которых версионируем иерархию в группах, порядок, состав подчиненных элементов. |
| 100 | + |
| 101 | +Пример файла "Алгоритмы.xml" |
| 102 | +``` |
| 103 | +<Алгоритмы> |
| 104 | + <Группа Имя="Выгрузка"> |
| 105 | + <Алгоритм Имя="ВыгрузитьОстаткиМатериалов"></Алгоритм> |
| 106 | + <Алгоритм Имя="ВыгрузитьОстаткиНоменклатурыПоСчету"></Алгоритм> |
| 107 | + <Алгоритм Имя="ВыгрузитьОстаткиТМЦвЭксплуатации"></Алгоритм> |
| 108 | + <Алгоритм Имя="ВыгрузитьОстаткиТоваров"></Алгоритм> |
| 109 | + </Группа> |
| 110 | + <Группа Имя="Загрузка"> |
| 111 | + <Группа Имя="....."> |
| 112 | + <Алгоритм Имя="....."></Алгоритм> |
| 113 | + <Алгоритм Имя="....."></Алгоритм> |
| 114 | + <Алгоритм Имя="....."></Алгоритм> |
| 115 | + </Группа> |
| 116 | + <Алгоритм Имя="....."></Алгоритм> |
| 117 | + <Алгоритм Имя="....."></Алгоритм> |
| 118 | + <Алгоритм Имя="....."></Алгоритм> |
| 119 | + </Группа> |
| 120 | + </Алгоритмы> |
| 121 | +``` |
| 122 | + |
| 123 | +*А где отдельные свойства ПКО, а отдельные алгоритмы обработчиков свойств?* |
| 124 | +Это несложно добавить в схему самостоятельно. |
| 125 | +Проба разбора свойств ПКО в отдельные файлы (в подпапку ПКО-ХХХ) превратила разобранные файлы в плохо анализируемый винегрет. Поэтому в дефолтной схеме детализация до ПКО. |
| 126 | + |
| 127 | +## Где сборка правил? |
| 128 | + |
| 129 | +С учетом того, что исходный файл правил тоже хранится в репозитории (разбор выполняется только для файлов в индексе), то обратная сборка в текущий момент не целесообразна. Но ее можно сделать гарантируя соблюдение струтуры и порядка исходного файла правил. По идее для этого можно будет использовать схему, которая хранится в репозитории. Но пока сборка не планируется. |
0 commit comments