diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b52e27e --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.vscode/launch.json +edt-validate-results +edt-validate-results-en +out.json +*.ospx diff --git a/README.md b/README.md index 83dc27a..f1bfb08 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,51 @@ -# edt_to_sonar_export +# edt-ripper +Консольная утилита для работы с замечаниями ЕДТ и файлами правил для SQ. выполняет разбор EDT отчета анализа проекта. Формирует результат в формате bsl-ls. +Мапит обнаруженные замечания с правилами (внутренний файл правил, внешний файл правил) + +## Возможности + + 1. Команда `parse` - Преобразует файл с результатом анализа проекта из ЕДТ в отчет формата BSL LS. Если замечание будет новое, для которого еще нет правила, оно будет добавлено в хранилище правил. + + 2. Команда `publish` - удалит всю служебную информацию из хранилища правил. Итоговый файл готов к загрузке в SQ. + +## Ограничения + ++ Версия EDT > 2021.2 + +## Предварительные настройки и порядок использования + +Действия выполняются через UI SQ или через sonar.properties + ++ Активировать в SQ свойство `sonar.bsl.edt.enabled` ++ Активировать в SQ свойство `sonar.bsl.edt.createExternalIssues` - опционально, но количество внешних замечаний позволит замечать необходимость обновить правила. ++ Заполнить в SQ свойство `sonar.bsl.edt.rulesPaths` и положить ваш файл с правилами (или экспортированный командой `publish`) по этому пути в SQ. ++ Перезагрузить SQ чтобы правила отобразились в связанных с EDT профилях качества. ++ Проверить что правила появились. Ввиду особенности работы SQ может потребоваться удалить и установить плагин sonar-bsl чтобыправила обновились в профиле качества. ++ Путь к файлу с результатом работы программы указывается в свойстве `sonar.bsl.languageserver.reportPaths` сканера SQ + +## Пример использования + ++ Разобрать замечания ЕДТ для проекта *configuration* в репозитории *my_awersome_rep* с внешним файлом правил и создать отчет *out.json*. + +``` + edt-ripper -f /mnt/share/custom-rules.json parse ./edt-validate-results ./my_awersome_rep/ configuration ./out.json +``` + ++ Разобрать замечания ЕДТ для проекта *configuration* в репозитории *my_awersome_rep* с внутренним файлом правил и создать отчет *out.json* + +``` + edt-ripper parse ./edt-validate-results ./my_awersome_rep/ configuration ./out.json +``` + ++ Разобрать замечания для проектов *configuration* и *exts* в репозитории *my_awersome_rep* с внутренним файлом правил и создать отчет *out.json* + +``` + edt-ripper parse ./edt-validate-results ./my_awersome_rep/ configuration exts ./out.json +``` + +## todo + ++ Поддержка файла исключений ++ Хранение и обновление файла custom-rules на Nexus ++ Команда для мержа n разных файлов правил diff --git a/custom-rules.json b/custom-rules.json new file mode 100755 index 0000000..1c1ed99 --- /dev/null +++ b/custom-rules.json @@ -0,0 +1,1184 @@ +{ + "Rules": [ + { + "Code": "edt-001", + "InternalCode": "Переменная %1 не определена", + "Name": "Переменная %1 не определена", + "Description": "\n\n\n\n

Например, имеем следущий код в модулях конфигурации:

\n
ШаблонТекста = НСтр(\"ru='Первый параметр %1, второй параметр %2'\");
Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, 1, 2);
\n

Избавимся от прослойки вызовов и лишних методов с помощью метода СтрШаблон():

\n
ШаблонТекста = НСтр(\"ru='Первый параметр %1, второй параметр %2'\");
Текст = СтрШаблон(ШаблонТекста, 1, 2);
\n

Конфигурация не всегда сразу полностью переводится на другой язык. И, если в системе будет работать пользователь, у которого будет установлен язык не RU, то первый код отработает корректно, а второй выдаст ошибку исполнения.

\n

Во втором случае локализованной строки нет, следовательно, параметров в строке нет,  следовательно, возникает ошибка исполнения.

\n

В связи с этим, в модулях конфигураций принято решение не использовать СтрШаблон() до исправления ошибки платформы.

", + "Type": "BUG", + "Severity": "CRITICAL", + "EffortMinutes": 1, + "Active": true + }, + { + "Code": "EDT-2", + "InternalCode": "com.e1c.v8codestyle.bsl:invocation-form-event-handler", + "Name": "Программный вызов обработчика события формы", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "INFO", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-3", + "InternalCode": "com.e1c.v8codestyle.bsl:empty-except-statement", + "Name": "не содержит кода в исключении", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-4", + "InternalCode": "Возвращает тип, который имеет отличное окружение от контекста вызова", + "Name": "Возвращает тип, который имеет отличное окружение от контекста вызова", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-5", + "InternalCode": "Возможно, выражение не является объектом коллекции", + "Name": "Возможно, выражение не является объектом коллекции", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-6", + "InternalCode": "Возможно, недостижимое выражение", + "Name": "Возможно, недостижимое выражение", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-7", + "InternalCode": "com.e1c.v8codestyle.bsl:module-unused-local-variable", + "Name": "Возможно, переменная еще не была проинициализирована", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-8", + "InternalCode": "Возможно, строковый литерал содержит ошибку", + "Name": "Возможно, строковый литерал содержит ошибку", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-9", + "InternalCode": "com.e1c.v8codestyle.bsl:new-color", + "Name": "Для изменения оформления следует использовать элементы стиля, а не задавать конкретные значения непосредственно в элементах управления", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-10", + "InternalCode": "Для объекта определен ручной порядок подсистем, но подсистема отсутствует в порядке подсистем", + "Name": "Для объекта определен ручной порядок подсистем, но подсистема отсутствует в порядке подсистем", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-11", + "InternalCode": "com.e1c.v8codestyle.md:mdo-scheduled-job-description", + "Name": "Задано наименование предопределенного регламентного задания", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-12", + "InternalCode": "com.e1c.v8codestyle.bsl:use-non-recommended-method", + "Name": "Используется не рекомендуемый метод", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-13", + "InternalCode": "com.e1c.v8codestyle.bsl:using-isinrole", + "Name": "Используйте функцию вместо", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-14", + "InternalCode": "com.e1c.v8codestyle.bsl:structure-consructor-too-many-keys", + "Name": "Конструктор структуры содержит более чем 5 ключей", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-15", + "InternalCode": "Менеджер записи не может быть использован для регистра с режимом записи", + "Name": "Менеджер записи не может быть использован для регистра с режимом записи", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-16", + "InternalCode": "com.e1c.v8codestyle.bsl:lock-out-of-try", + "Name": "Метод Заблокировать() вне блока Попытка-Исключение", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-17", + "InternalCode": "com.e1c.v8codestyle.bsl:module-accessibility-at-client", + "Name": "Метод доступен НаКлиенте", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-18", + "InternalCode": "Метод устарел", + "Name": "Метод устарел", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-19", + "InternalCode": "com.e1c.v8codestyle.bsl:bsl-nstr-string-literal-format", + "Name": "НСтр метод должен принимать строку первым параметром", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-20", + "InternalCode": "Не рекомендуется создавать подсистемы глубиной вложенности более трех", + "Name": "Не рекомендуется создавать подсистемы глубиной вложенности более трех", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-21", + "InternalCode": "com.e1c.v8codestyle.bsl:export-method-in-command-form-module", + "Name": "Не следует размещать экспортные процедуры и функции в модулях команд и форм. К этим модулям нет возможности обращаться из внешнего по отношению к ним кода, поэтому экспортные процедуры и функции в этих модулях не имеют смысла.", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-22", + "InternalCode": "Неизвестное имя типа", + "Name": "Неизвестное имя типа", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-23", + "InternalCode": "com.e1c.v8codestyle.bsl:module-unused-method", + "Name": "Неиспользуемый метод", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-24", + "InternalCode": "Некорректное значение свойства XDTO-пакета. Пространство имен пакета совпадает с пространством имен пакета", + "Name": "Некорректное значение свойства XDTO-пакета. Пространство имен пакета совпадает с пространством имен пакета", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-25", + "InternalCode": "Нельзя передавать объект типа между клиентом и сервером", + "Name": "Нельзя передавать объект типа между клиентом и сервером", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-26", + "InternalCode": "Нельзя присваивать атрибуту формы значение типа", + "Name": "Нельзя присваивать атрибуту формы значение типа", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-27", + "InternalCode": "Нет соответствия между ожидаемыми типами", + "Name": "Нет соответствия между ожидаемыми типами", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-28", + "InternalCode": "Объект данного тип не может быть создан через оператор", + "Name": "Объект данного тип не может быть создан через оператор", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-29", + "InternalCode": "com.e1c.v8codestyle.bsl:doc-comment-procedure-return-section", + "Name": "Описание процедуры не должно содержать блок", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-30", + "InternalCode": "com.e1c.v8codestyle.bsl:event-heandler-boolean-param", + "Name": "Параметр должен устанавливаться в Ложь, но выражение может заменить текущее значение в Истина", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-31", + "InternalCode": "com.e1c.v8codestyle.bsl:doc-comment-parameter-section", + "Name": "Пропущено определение параметра для", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-32", + "InternalCode": "com.e1c.v8codestyle.bsl:module-empty-method", + "Name": "Пустой метод", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-33", + "InternalCode": "Свойство объекта не обнаружено", + "Name": "Свойство объекта не обнаружено", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-34", + "InternalCode": "Свойство устарело", + "Name": "Свойство устарело", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-35", + "InternalCode": "com.e1c.v8codestyle.bsl:doc-comment-ref-link", + "Name": "Ссылка на несуществующий объект", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-36", + "InternalCode": "com.e1c.v8codestyle.ql:ql-camel-case-string-literal", + "Name": "Строковый литерал содержит не CamelCase символы", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-37", + "InternalCode": "Тип устарел", + "Name": "Тип устарел", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-38", + "InternalCode": "com.e1c.v8codestyle.form:input-field-list-choice-mode", + "Name": "У поля ввода формы с заполненным списком выбора отключено свойство", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-39", + "InternalCode": "Функция должна возвращать значение", + "Name": "Функция должна возвращать значение", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-40", + "InternalCode": "Элемент с таким именем уже есть в глобальном контексте", + "Name": "Элемент с таким именем уже есть в глобальном контексте", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-41", + "InternalCode": "com.e1c.dt.check.form:form-named-element-name", + "Name": "Имя именованного элемента формы пустое", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-42", + "InternalCode": "com.e1c.v8codestyle.bsl:form-module-pragma", + "Name": "Использована директива компиляции модуля формы", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-43", + "InternalCode": "com.e1c.v8codestyle.ql:ql-temp-table-index", + "Name": "Новая временная таблица должна содержать индексы", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-44", + "InternalCode": "com.e1c.v8codestyle.bsl:notify-description-to-server-procedure", + "Name": "Описание оповещения на серверную процедуру", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-45", + "InternalCode": "com.e1c.v8codestyle.bsl:doc-comment-export-function-return-section", + "Name": "Описание экспортируемой функции должно содержать блок", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-46", + "InternalCode": "com.e1c.v8codestyle.ql:ql-virtual-table-filters", + "Name": "Отбор ABCXYZКлассификацияКлиентовСрезПоследних.ТипКлассификации для виртуальной таблицы ABCXYZКлассификацияКлиентовСрезПоследних должен быть в параметрах", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-47", + "InternalCode": "com.e1c.v8codestyle.bsl:data-exchange-load", + "Name": "Отсутствует обязательная проверка признака ОбменДанными.Загрузка в обработчике события", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-48", + "InternalCode": "com.e1c.v8codestyle.md:shceduled-job-periodicity-too-short", + "Name": "Периодичность выполнения регламентного задания меньше 60сек", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-49", + "InternalCode": "com.e1c.v8codestyle.right:right-start-web-client", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-50", + "InternalCode": "com.e1c.v8codestyle.right:right-output-to-printer-file-clipboard", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-51", + "InternalCode": "com.e1c.v8codestyle.right:right-interactive-set-deletion-mark-predefined-data", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-52", + "InternalCode": "com.e1c.v8codestyle.right:right-interactive-clear-deletion-mark-predefined-data", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-53", + "InternalCode": "com.e1c.v8codestyle.right:right-interactive-delete", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-54", + "InternalCode": "com.e1c.v8codestyle.right:right-interactive-delete-marked-predefined-data", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-55", + "InternalCode": "com.e1c.v8codestyle.right:right-interactive-delete-predefined-data", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-56", + "InternalCode": "com.e1c.v8codestyle.right:right-exclusive-mode", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-57", + "InternalCode": "com.e1c.v8codestyle.right:right-save-user-data", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-58", + "InternalCode": "com.e1c.v8codestyle.right:right-start-thin-client", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-59", + "InternalCode": "com.e1c.v8codestyle.bsl:form-module-missing-pragma", + "Name": "Пропущена директива компиляции", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-60", + "InternalCode": "com.e1c.dt.check.form:form-data-path", + "Name": "Свойство имеет некорректное значение", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-61", + "InternalCode": "com.e1c.v8codestyle.ql:ql-join-to-sub-query", + "Name": "Соединение в запросе с подзапросом не разрешено", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-62", + "InternalCode": "com.e1c.v8codestyle.bsl:module-structure-top-region", + "Name": "Стандартная область структуры модуля является вложенной", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-63", + "InternalCode": "com.e1c.v8codestyle.bsl:doc-comment-use-minus", + "Name": "Только символ дефис-минуса разрешено использовать в документирующем комментарии, но найдено", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-64", + "InternalCode": "com.e1c.v8codestyle.md:common-module-name-global", + "Name": "Глобальный общий модуль должен оканчиваться на суффикс", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "CRITICAL", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-65", + "InternalCode": "com.e1c.v8codestyle.md:mdo-name-length", + "Name": "Длина имени объекта метаданного должна быть меньше чем 80", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "CRITICAL", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-66", + "InternalCode": "com.e1c.v8codestyle.bsl:query-in-loop", + "Name": "Цикл содержит вызов метода с запросом", + "Description": "Отсутствует", + "Type": "BUG", + "Severity": "CRITICAL", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-67", + "InternalCode": "Can be only one default item in root subgroup", + "Name": "Can be only one default item in root subgroup", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-68", + "InternalCode": "Duplicate id", + "Name": "Duplicate id", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-69", + "InternalCode": "Для команды категория группы команд по умолчанию может быть только Панель навигации или Панель действий", + "Name": "Для команды категория группы команд по умолчанию может быть только Панель навигации или Панель действий", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-70", + "InternalCode": "Для команды формы назначен обработчик, но метод с таким именем отсутствует в модуле формы", + "Name": "Для команды формы назначен обработчик, но метод с таким именем отсутствует в модуле формы", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-71", + "InternalCode": "Для события элемента формы назначен обработчик, но метод с таким именем отсутствует в модуле формы", + "Name": "Для события элемента формы назначен обработчик, но метод с таким именем отсутствует в модуле формы", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-72", + "InternalCode": "Для события формы назначен обработчик, но метод с таким именем отсутствует в модуле формы", + "Name": "Для события формы назначен обработчик, но метод с таким именем отсутствует в модуле формы", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-73", + "InternalCode": "Код никогда не будет скомпилирован", + "Name": "Код никогда не будет скомпилирован", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-74", + "InternalCode": "Лексическое значение значения по умолчанию не соответствует типу \"{http", + "Name": "Лексическое значение значения по умолчанию не соответствует типу \"{http", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-75", + "InternalCode": "Не найден обработчик для Подписки на событие", + "Name": "Не найден обработчик для Подписки на событие", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-76", + "InternalCode": "Не найден обработчик для Регламентного задания", + "Name": "Не найден обработчик для Регламентного задания", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-77", + "InternalCode": "Недостаточное число параметров", + "Name": "Недостаточное число параметров", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-78", + "InternalCode": "Некорректное значение свойства характеристики. Значение свойства не определено", + "Name": "Некорректное значение свойства характеристики. Значение свойства не определено", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-79", + "InternalCode": "Некорректное значение свойства. Дублирование имени объекта метаданных", + "Name": "Некорректное значение свойства. Дублирование имени объекта метаданных", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-80", + "InternalCode": "Некорректный тип параметра для стандартной команды. Допустимые типы, а получены", + "Name": "Некорректный тип параметра для стандартной команды. Допустимые типы, а получены", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-81", + "InternalCode": "Неподдерживаемый оператор", + "Name": "Неподдерживаемый оператор", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-82", + "InternalCode": "Переменная не определена", + "Name": "Переменная не определена", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-83", + "InternalCode": "Поле связи параметра выбора не указано или некорректно", + "Name": "Поле связи параметра выбора не указано или некорректно", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-84", + "InternalCode": "Поле связи параметра выбора не является допустимым", + "Name": "Поле связи параметра выбора не является допустимым", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-85", + "InternalCode": "Процедура или функция не определена", + "Name": "Процедура или функция не определена", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-86", + "InternalCode": "Процедура или функция с таким именем уже определена", + "Name": "Процедура или функция с таким именем уже определена", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-87", + "InternalCode": "Свойство не предназначено для записи у типа", + "Name": "Свойство не предназначено для записи у типа", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-88", + "InternalCode": "Синтаксическая ошибка. Недопустимая лексема в данном контексте", + "Name": "Синтаксическая ошибка. Недопустимая лексема в данном контексте", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-89", + "InternalCode": "Синтаксическая ошибка. Пропущена лексема у", + "Name": "Синтаксическая ошибка. Пропущена лексема у", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-90", + "InternalCode": "Слишком много параметров", + "Name": "Слишком много параметров", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-91", + "InternalCode": "Слишком много параметров для типа(ов)", + "Name": "Слишком много параметров для типа(ов)", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-92", + "InternalCode": "Тип не может иметь фасет", + "Name": "Тип не может иметь фасет", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-93", + "InternalCode": "Тип неопределен", + "Name": "Тип неопределен", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-94", + "InternalCode": "Функция не определена", + "Name": "Функция не определена", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-95", + "InternalCode": "Этот тип не может входить в состав составного типа", + "Name": "Этот тип не может входить в состав составного типа", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MAJOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-96", + "InternalCode": "Данный модуль не поддерживает данный тип директив компиляции", + "Name": "Данный модуль не поддерживает данный тип директив компиляции", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-97", + "InternalCode": "com.e1c.v8codestyle.right:right-view-event-log", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-98", + "InternalCode": "com.e1c.v8codestyle.right:right-interactive-open-external-data-processors", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-99", + "InternalCode": "com.e1c.v8codestyle.right:right-interactive-open-external-reports", + "Name": "Право роли установлено для", + "Description": "Отсутствует", + "Type": "VULNERABILITY", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-100", + "InternalCode": "com.e1c.v8codestyle.md:common-module-name-client-server", + "Name": "Клиент-серверный общий модуль должен оканчиваться на суффикс", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-101", + "InternalCode": "Duplicate column name", + "Name": "Duplicate column name", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-102", + "InternalCode": "Duplicate content", + "Name": "Duplicate content", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-103", + "InternalCode": "Illegal ShortCut", + "Name": "Illegal ShortCut", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-104", + "InternalCode": "Данный модуль может содержать только процедуры и функции", + "Name": "Данный модуль может содержать только процедуры и функции", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-105", + "InternalCode": "Недостаточное число параметров для типа(ов)", + "Name": "Недостаточное число параметров для типа(ов)", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-106", + "InternalCode": "Неизвестный оператор", + "Name": "Неизвестный оператор", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-107", + "InternalCode": "Некорректное значение свойства. Указан нумератор. Свойства документа должны совпадать с соответствующими свойствами нумератора.", + "Name": "Некорректное значение свойства. Указан нумератор. Свойства документа должны совпадать с соответствующими свойствами нумератора.", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-108", + "InternalCode": "Некорректное значение свойства реквизита. Тип использования реквизита противоречит выбранному типу иерархии", + "Name": "Некорректное значение свойства реквизита. Тип использования реквизита противоречит выбранному типу иерархии", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-109", + "InternalCode": "Оператор может использоваться только внутри процедур и функций", + "Name": "Оператор может использоваться только внутри процедур и функций", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-110", + "InternalCode": "Процедура вызывается как функция", + "Name": "Процедура вызывается как функция", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-111", + "InternalCode": "Синтаксическая ошибка. Неверная лексема - ожидается", + "Name": "Синтаксическая ошибка. Неверная лексема - ожидается", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-112", + "InternalCode": "Синтаксическая ошибка. Неверный ввод - ожидается", + "Name": "Синтаксическая ошибка. Неверный ввод - ожидается", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-113", + "InternalCode": "Указанный обработчик события не существует", + "Name": "Указанный обработчик события не существует", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-114", + "InternalCode": "Встроенная функция может быть использована только в выражении.", + "Name": "Встроенная функция может быть использована только в выражении.", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-115", + "InternalCode": "Ошибочный порядок грамматических элементов", + "Name": "Ошибочный порядок грамматических элементов", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-116", + "InternalCode": "Синтаксическая ошибка. Неверный ввод", + "Name": "Синтаксическая ошибка. Неверный ввод", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-117", + "InternalCode": "Тип не определен", + "Name": "Тип не определен", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + }, + { + "Code": "EDT-118", + "InternalCode": "Синтаксическая ошибка. Неизвестная лексема", + "Name": "Синтаксическая ошибка. Неизвестная лексема", + "Description": "Отсутствует", + "Type": "CODE_SMELL", + "Severity": "MINOR", + "Active": true, + "EffortMinutes": 3 + } + ] +} \ No newline at end of file diff --git a/installlocalhost.bat b/installlocalhost.bat new file mode 100644 index 0000000..fb6f30a --- /dev/null +++ b/installlocalhost.bat @@ -0,0 +1,12 @@ +@echo off +call del "*.ospx" + +for /f %%i in ('"oscript -version"') do set result=%%i + +if %result%==1.0.19.105 ( + call opm build . -mf ./packagedef -out . +) else ( + call opm build -m ./packagedef -o . +) + +call opm install -f *.ospx diff --git a/packagedef b/packagedef new file mode 100644 index 0000000..729e246 --- /dev/null +++ b/packagedef @@ -0,0 +1,19 @@ +ПутКПараметрам = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os"); +Параметры = ЗагрузитьСценарий(ПутКПараметрам); + +Описание.Имя(Параметры.ИмяПриложения()) + .Версия(Параметры.Версия()) + .Автор("") + .АдресАвтора("") + .Описание("Отправка замечаний edt в отчет для сонара") + .ВерсияСреды("1.7.0") + .ВключитьФайл("src") + .ВключитьФайл("doc") + .ВключитьФайл("tasks") + .ВключитьФайл("custom-rules.json") + .ЗависитОт("logos") + .ЗависитОт("cli") + .ЗависитОт("fs") + .ЗависитОт("v8metadata-reader") + .ИсполняемыйФайл("src/main.os") + ; diff --git a/src/main.os b/src/main.os new file mode 100644 index 0000000..99f49e0 --- /dev/null +++ b/src/main.os @@ -0,0 +1,61 @@ +#Использовать "." +#Использовать cli + +Перем Лог; + +Процедура ВыполнитьПриложение() + + Приложение = Новый КонсольноеПриложение(ПараметрыПриложения.ИмяПриложения(), + "Приложение для работы с файлами ошибок статических анализаторов", + ЭтотОбъект); + + Приложение.Версия("version", ПараметрыПриложения.Версия()); + + Приложение.Опция("v verbose", Ложь, "Вывод отладочной информация в процессе выполнения") + .Флаговый(); + + Приложение.Опция("f file", "", "Путь к внешнему файлу-коллектору замечаний") + .ТСтрока(); + + Приложение.ДобавитьКоманду("parse", "Создание отчета", + Новый КомандаПарсерОтчетаЕДТ); + + Приложение.ДобавитьКоманду("publish", "Удаление из выбранного файла правил служебных блоков, + | результирующий файл готов для загрузки в сонар", + Новый КомандаПубликацияПравил); + + Приложение.Запустить(АргументыКоманднойСтроки); + +КонецПроцедуры + +Процедура ПередВыполнениемКоманды(Знач Команда) Экспорт + + ОтладкаВключена = Команда.ЗначениеОпции("verbose"); + + ПараметрыПриложения.УстановитьРежимОтладки(ОтладкаВключена); + + ВнешнийФайлОписаний = Команда.ЗначениеОпции("file"); + + Если ЗначениеЗаполнено(ВнешнийФайлОписаний) Тогда + Файл = Новый Файл(ВнешнийФайлОписаний); + Если НЕ (Файл.Существует() И Файл.ЭтоФайл()) Тогда + Лог.КритичнаяОшибка("Файл %1 недоступен", ВнешнийФайлОписаний); + КонецЕсли; + КонецЕсли; + + ПараметрыПриложения.УстановитьКонтекстСохранения(ВнешнийФайлОписаний); + +КонецПроцедуры + +Лог = ПараметрыПриложения.Лог(); + +Попытка + + ВыполнитьПриложение(); + +Исключение + + Лог.КритичнаяОшибка(ОписаниеОшибки()); + ЗавершитьРаботу(1); + +КонецПопытки; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\236\321\202\321\207\320\265\321\202\320\276\320\262BSL.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\236\321\202\321\207\320\265\321\202\320\276\320\262BSL.os" new file mode 100644 index 0000000..a624388 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\236\321\202\321\207\320\265\321\202\320\276\320\262BSL.os" @@ -0,0 +1,136 @@ +#Использовать fs + +#Область ОписаниеПеременных + +// Содержит формируемый отчет в формате BSL LS +Перем Отчет; + +// Переменная для логирования +Перем Лог; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Создает новое пустое замечание для файла и пополняет коллекци замечаний. +// +// Параметры: +// Путь - Строка - Путь к bsl файлу для регистрации нового замечания +// +// Возвращаемое значение: +// Структура - Все поля описаны в файле diagnostic.json +// +Функция НовыйЗамечаниеДляОбъекта(Путь) Экспорт + + // СырыеДанныеСтрокой() - промежуточный слой для хранения замечаний. Ключ для регистрации - имя файла. + РазделЗамечанияДляФайла = Отчет[СырыеДанныеСтрокой()].Получить(Путь); + + Если РазделЗамечанияДляФайла = Неопределено Тогда + + Отчет[СырыеДанныеСтрокой()].Вставить(Путь, Новый Структура("diagnostics", Новый Массив)); + + КонецЕсли; + + Замечание = Замечание(); + + Отчет[СырыеДанныеСтрокой()][Путь].diagnostics.Добавить(Замечание); + + Возврат Замечание; + +КонецФункции + +// Записывает отчет в файл, если путь не передан, отчет запишется в текущий каталог запуска +// +// Параметры: +// Путь - Строка - Путь к файлу, куда будет записан отчет в формате BSL LS +// +Процедура ЗаписатьОтчет(Путь = Неопределено) Экспорт + + Если Путь = Неопределено Тогда + Путь = ОбъединитьПути(ТекущийКаталог(), "edt-bsl-report.json"); + КонецЕсли; + + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.ОткрытьФайл(Путь, "UTF-8", , Новый ПараметрыЗаписиJSON(, Символы.Таб)); + + ИзменитьСтруктуруОтчета(); + + ЗаписатьJSON(ЗаписьJSON, Отчет); + ЗаписьJSON.Закрыть(); + + Лог.Информация("Записан файл %1", Путь); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ИзменитьСтруктуруОтчета() + + Для Каждого ОбъектЗамечаний Из Отчет[СырыеДанныеСтрокой()] Цикл + + Замечание = Новый Соответствие; + Замечание.Вставить("path", ОбъектЗамечаний.Ключ); + Замечание.Вставить("diagnostics", ОбъектЗамечаний.Значение.diagnostics); + Отчет["fileinfos"].Добавить(Замечание); + + КонецЦикла; + + Отчет.Удалить(СырыеДанныеСтрокой()); + +КонецПроцедуры + +Функция СырыеДанныеСтрокой() + + Возврат "fileinfos_dirty"; + +КонецФункции + +Функция ПрочитатьОбъект(ПутьКФайлу, ВСоответствие = Истина) + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.ОткрытьФайл(ПутьКФайлу, "UTF-8"); + + Объект = ПрочитатьJSON(ЧтениеJSON, ВСоответствие); + ЧтениеJSON.Закрыть(); + + Возврат Объект; + +КонецФункции + +Функция ШаблонОтчет() + + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", Ресурсы(), "report.json"); + +КонецФункции + +Функция ШаблонЗамечания() + + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", Ресурсы(), "diagnostic.json"); + +КонецФункции + +Функция Ресурсы() + + Возврат "Ресурсы"; + +КонецФункции + +Функция Замечание() + + Возврат ПрочитатьОбъект(ШаблонЗамечания(), Ложь); + +КонецФункции + +Процедура ПриСозданииОбъекта() + + Отчет = ПрочитатьОбъект(ШаблонОтчет()); + + Отчет["date"] = Формат(ТекущаяУниверсальнаяДата(), "ДФ='yyyy-MM-dd HH:mm:ss'"); + +КонецПроцедуры + +#КонецОбласти + +Лог = ПараметрыПриложения.Лог(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\260\321\200\321\201\320\265\321\200\320\236\321\202\321\207\320\265\321\202\320\260\320\225\320\224\320\242.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\260\321\200\321\201\320\265\321\200\320\236\321\202\321\207\320\265\321\202\320\260\320\225\320\224\320\242.os" new file mode 100644 index 0000000..4cffc64 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\260\321\200\321\201\320\265\321\200\320\236\321\202\321\207\320\265\321\202\320\260\320\225\320\224\320\242.os" @@ -0,0 +1,69 @@ +Процедура ОписаниеКоманды(Команда) Экспорт + + Команда.Аргумент("PATH", "", "Файл с отчетом") + .ТСтрока(); + + Команда.Аргумент("WORKDIR", "", "Корень репозитория или проектной области") + .ТСтрока(); + + Команда.Аргумент("PROJECTS", Новый Массив, "Список проектов, которые были переданы в ЕДТ для анализа") + .ТМассивСтрок(); + + Команда.Аргумент("OUT", "", "Путь к файлу отчета в формате BSL LS") + .ТСтрока(); + + Команда.Опция("nixPath", Истина, "Использовать пути как в линукс системах") + .ТБулево(); + +КонецПроцедуры + +Процедура ПередВыполнениемКоманды(Знач Команда) Экспорт + + Лог = ПараметрыПриложения.Лог(); + + БылиОшибки = Ложь; + + ФайлДляОбработки = Новый Файл(Команда.ЗначениеАргумента("PATH")); + + Если НЕ (ФайлДляОбработки.Существует() И ФайлДляОбработки.ЭтоФайл()) Тогда + Лог.Ошибка("Не найден файл %1", Команда.ЗначениеАргумента("PATH")); + БылиОшибки = Истина; + КонецЕсли; + + Репозиторий = Новый Файл(Команда.ЗначениеАргумента("WORKDIR")); + + Если НЕ (Репозиторий.Существует() И Репозиторий.ЭтоКаталог()) Тогда + Лог.Ошибка("Не найден корневой каталог проектов %1", Команда.ЗначениеАргумента("WORKDIR")); + БылиОшибки = Истина; + КонецЕсли; + + Проекты = Команда.ЗначениеАргумента("PROJECTS"); + + Для Каждого Проект Из Проекты Цикл + + ДиректорияПроекта = Новый Файл(ОбъединитьПути(Команда.ЗначениеАргумента("WORKDIR"), Проект)); + + Если НЕ (ДиректорияПроекта.Существует() И ДиректорияПроекта.ЭтоКаталог()) Тогда + Лог.Ошибка("Не найден корневой каталог проекта %1 в %2", Проект, Команда.ЗначениеАргумента("WORKDIR")); + БылиОшибки = Истина; + КонецЕсли; + + КонецЦикла; + + Если БылиОшибки Тогда + ВызватьИсключение "Продолжение работы невозможно"; + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьКоманду(Знач Команда) Экспорт + + ФайлДляОбработки = Команда.ЗначениеАргумента("PATH"); + Репозиторий = Команда.ЗначениеАргумента("WORKDIR"); + Проекты = Команда.ЗначениеАргумента("PROJECTS"); + ФайлРезультата = Команда.ЗначениеАргумента("OUT"); + ПутиКакВЛинукс = Команда.ЗначениеОпции("nixPath"); + + ПарсерОшибок.Прочитать(ФайлДляОбработки, Репозиторий, Проекты, ФайлРезультата, ПутиКакВЛинукс); + +КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\203\320\261\320\273\320\270\320\272\320\260\321\206\320\270\321\217\320\237\321\200\320\260\320\262\320\270\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\203\320\261\320\273\320\270\320\272\320\260\321\206\320\270\321\217\320\237\321\200\320\260\320\262\320\270\320\273.os" new file mode 100644 index 0000000..b0109f4 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\203\320\261\320\273\320\270\320\272\320\260\321\206\320\270\321\217\320\237\321\200\320\260\320\262\320\270\320\273.os" @@ -0,0 +1,14 @@ +Процедура ОписаниеКоманды(Команда) Экспорт + + Команда.Аргумент("OUT", "", "Путь к файлу отчета в формате BSL LS") + .ТСтрока(); + +КонецПроцедуры + +Процедура ВыполнитьКоманду(Знач Команда) Экспорт + + ФайлРезультата = Команда.ЗначениеАргумента("OUT"); + ХранилищеПравил = Новый ХранилищеПравил; + ХранилищеПравил.Опубликовать(ФайлРезультата); + +КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\237\321\200\320\260\320\262\320\270\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\237\321\200\320\260\320\262\320\270\320\273.os" new file mode 100644 index 0000000..456af81 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\237\321\200\320\260\320\262\320\270\320\273.os" @@ -0,0 +1,145 @@ +#Область ОписаниеПеременных + +// Хранилище правилы +Перем Правила; +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Ищет в коллекции правил элемент по имени правила +// +// Параметры: +// Код - Строка - Код правила - нормализованная строка пригодная быть в качестве кода либо сам код из ЕДТ +// +// Возвращаемое значение: +// Структура - Структура с описанием правила (подробнее см НовыйПравило) +// +Функция НайтиПоКоду (Код) Экспорт + + Возврат Правила.ПоКоду.Получить(Код); + +КонецФункции + +// Считает количество добавленных правил +// +// Возвращаемое значение: +// Число - количество правил, сохраненных в файле с описанием правил +// +Функция Количество() Экспорт + + Возврат Правила.ПоКоду.Количество(); + +КонецФункции + +// Добавляет новые правила в хранилище правил +// +// Параметры: +// МассивДобавлений - <Массив> - Массив с новыми правилами, которые будут записаны в итоговый файл +// +Процедура Дополнить(МассивДобавлений) Экспорт + + Объект = ПравилаКакОбъект(); + + Для Каждого Добавление Из МассивДобавлений Цикл + + Объект.Rules.Добавить(Добавление.Значение); + + КонецЦикла; + + ЗаписатьОбъект(ПараметрыПриложения.ПолучитьКонтекст(), Объект); + +КонецПроцедуры + +// Обрабатывает хранилище правил во внутреннем формате и создает файл, пригодный для экспорта в SQ +// +// Параметры: +// Путь - Строка - Путь к файлу результата. +// +Процедура Опубликовать(Путь) Экспорт + + Объект = ПравилаКакОбъект(); + + МаксимальнаяДлиннаИмениПравила = 198; + Для Каждого Правило Из Объект.Rules Цикл + // InternalCode используется для внутреннего сопоставления и для SQ будет являться лишним атрибутом + Правило.Удалить("InternalCode"); + + Если СтрДлина(Правило.Name) >= 198 Тогда + + Правило.Description = Правило.Name; + Правило.Name = Лев(Правило.Name, 198); + + КонецЕсли; + + КонецЦикла; + + ЗаписатьОбъект(Путь, Объект); + +КонецПроцедуры + +// Создает базовое описание нового правила по замечанию, которое нашло ЕДТ. +// +// Параметры: +// ВнутреннийКод - Строка - Код из ЕДТ или нормализованное имя правила +// Имя - Строка - Имя правила +// Тип - ТипыЗамечаний - Тип замечания (см ТипыЗамечаний) +// Критичность - КритичностьЗамечаний- Критичность замечания (см КритичностьЗамечаний) +// +// Возвращаемое значение: +// Структура- Описание нового правила +// +Функция НовыйПравило(ВнутреннийКод, Имя, Тип, Критичность) Экспорт + + Правило = Новый Структура; + Правило.Вставить("Code", ""); + Правило.Вставить("InternalCode", ВнутреннийКод); + Правило.Вставить("Name", Имя); + Правило.Вставить("Description", "Отсутствует"); + Правило.Вставить("Type", Тип); + Правило.Вставить("Severity", Критичность); + Правило.Вставить("Active", true); + Правило.Вставить("EffortMinutes", 3); + + Возврат Правило; + +КонецФункции + +#КонецОбласти + +Процедура ЗаписатьОбъект(ПутьКФайлу, ОбъектЗаписи) + + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.ОткрытьФайл(ПутьКФайлу, "UTF-8", , Новый ПараметрыЗаписиJSON(, Символы.Таб)); + ЗаписатьJSON(ЗаписьJSON, ОбъектЗаписи); + ЗаписьJSON.Закрыть(); + +КонецПроцедуры + +Функция ПрочитатьОбъект(ИмяФайла) + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.ОткрытьФайл(ИмяФайла, "UTF-8"); + Объект = ПрочитатьJSON(ЧтениеJSON, Ложь); + ЧтениеJSON.Закрыть(); + Возврат Объект; + +КонецФункции + +Функция ПравилаКакОбъект() + + Возврат ПрочитатьОбъект(ПараметрыПриложения.ПолучитьКонтекст()); + +КонецФункции + +Процедура ПриСозданииОбъекта() + + Объект = ПравилаКакОбъект(); + ПоКоду = Новый Соответствие(); + + Для Каждого Правило Из Объект.Rules Цикл + ПоКоду.Вставить(Правило.InternalCode, Правило); + КонецЦикла; + + Правила = Новый Структура("ПоКоду", ПоКоду); + +КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217.os" new file mode 100644 index 0000000..04e0c8f --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217.os" @@ -0,0 +1,155 @@ +#Использовать v8metadata-reader +#Использовать fs + +#Область ОписаниеПеременных + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Нормализует пути, заменяя раздетилель пути на тот, который используется на SQ +// +// Параметры: +// Путь - Строка - любой путь на ФС +// КакВЛинукс - Булево - Использовать разделитель пути как в линукс +// +// Возвращаемое значение: +// Строка - Нормализованный путь +// +Функция НормализованыйПуть(Путь, КакВЛинукс = Истина) Экспорт + + КонечныйПуть = ""; + + Если КакВЛинукс Тогда + КонечныйПуть = СтрЗаменить(Путь, "\", "/"); + Иначе + КонечныйПуть = СтрЗаменить(Путь, "/", "\"); + КонецЕсли; + + Возврат КонечныйПуть; + +КонецФункции + +// Нормализует пути, заменяя раздетилель пути на тот, который используется на SQ +// +// Параметры: +// Файл - Файл - Объект типа +// КакВЛинукс - Булево - Использовать разделитель пути как в линукс +// +// Возвращаемое значение: +// Строка - Нормализованный путь +// +Функция НормализованныйПутьФайла(Файл, КакВЛинукс = Истина) Экспорт + + Возврат НормализованыйПуть(Файл.ПолноеИмя, КакВЛинукс); + +КонецФункции + +// Определяет путь на ФС по которому находится объект метаданных +// +// Параметры: +// Генератор - v8metadata-reader.Путь1СПоМетаданным - Объект класса для поиска пути +// ОбъектМетаданных - Строка - Представление объекта метаданных +// +// Возвращаемое значение: +// Строка - Путь к объекту конфигурации на ФС +// +Функция ПутьКОбъектуКонфигурации(Генератор, ОбъектМетаданных) Экспорт + + Возврат Генератор.Путь(ОбъектМетаданных); + +КонецФункции + +// Возвращает нормализованный путь на ФС к объекту конфигурации +// +// Параметры: +// Генератор - v8metadata-reader.Путь1СПоМетаданным - Объект класса для поиска пути +// Объект - Строка - Представление объекта метаданных +// КакВЛинукс - Булево - Использовать пути как в линукс +// +// Возвращаемое значение: +// Строка - Нормализованный путь к объекту конфигурации на ФС +// +Функция НормализованныйПутьКОбъектуКонфигурации(Генератор, Объект, КакВЛинукс = Истина) Экспорт + + Возврат НормализованыйПуть(ПутьКОбъектуКонфигурации(Генератор, Объект), КакВЛинукс); + +КонецФункции + +// Проверяет существует ли путь на ФС к модулю объекта конфигурации, если путь не существует +// ищет верхнеуровневые модули. +// +// Параметры: +// Генератор - v8metadata-reader.Путь1СПоМетаданным - Объект класса для поиска пути +// Объект - Строка - Представление объекта метаданных +// +// Возвращаемое значение: +// Строка - Путь к модулю объекта конфигурации либо к модулю переопределенного объекта +// +Функция ПодобратьМодуль(Генератор, Знач Объект) Экспорт + + Переопределение = ""; + Шаблон = "%1.%2"; + ТипыМодулей = Новый Массив; + ТипыМодулей.Добавить(СтрШаблон(Шаблон, Объект, "Модуль")); + ТипыМодулей.Добавить(СтрШаблон(Шаблон, Объект, "МодульОбъекта")); + ТипыМодулей.Добавить(СтрШаблон(Шаблон, Объект, "МодульМенеджера")); + ТипыМодулей.Добавить(СтрШаблон(Шаблон, Объект, "МодульНабораЗаписей")); + ТипыМодулей.Добавить(СтрШаблон(Шаблон, Объект, "МодульКоманды")); + ТипыМодулей.Добавить(СтрШаблон(Шаблон, Объект, "МодульМенеджераЗначения")); + ТипыМодулей.Добавить(МодульПриложенияСтрокой()); + ТипыМодулей.Добавить(МодульОбычногоПриложенияСтрокой()); + ТипыМодулей.Добавить(МодульСеансаСтрокой()); + + Для Каждого ТипМодуля Из ТипыМодулей Цикл + + Если МожноИспользоватьВЗамечаниях(Генератор, ТипМодуля) Тогда + Переопределение = ТипМодуля; + Прервать; + КонецЕсли; + + КонецЦикла; + + Возврат Переопределение; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция МодульПриложенияСтрокой() + + Возврат "Конфигурация.МодульУправляемогоПриложения"; + +КонецФункции + +Функция МодульОбычногоПриложенияСтрокой() + + Возврат "Конфигурация.МодульОбычногоПриложения"; + +КонецФункции + +Функция МодульСеансаСтрокой() + + Возврат "Конфигурация.МодульСеанса"; + +КонецФункции + +Функция МожноИспользоватьВЗамечаниях(Знач Генератор, Знач Объект) + + Результат = Истина; + + Путь = НормализованныйПутьКОбъектуКонфигурации(Генератор, Объект); + + Если НЕ ЗначениеЗаполнено(Путь) ИЛИ НЕ ФС.ФайлСуществует(Путь) Тогда + Результат = Ложь; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +Лог = ПараметрыПриложения.Лог(); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\200\320\270\321\202\320\270\321\207\320\275\320\276\321\201\321\202\321\214\320\227\320\260\320\274\320\265\321\207\320\260\320\275\320\270\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\200\320\270\321\202\320\270\321\207\320\275\320\276\321\201\321\202\321\214\320\227\320\260\320\274\320\265\321\207\320\260\320\275\320\270\320\271.os" new file mode 100644 index 0000000..6b08f62 --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\200\320\270\321\202\320\270\321\207\320\275\320\276\321\201\321\202\321\214\320\227\320\260\320\274\320\265\321\207\320\260\320\275\320\270\320\271.os" @@ -0,0 +1,55 @@ +#Область ОписаниеПеременных + +Перем Информационное Экспорт; +Перем Незначительное Экспорт; +Перем Важное Экспорт; +Перем Критическое Экспорт; +Перем Блокирующее Экспорт; + +#КонецОбласти + +/////////////////////////////////////////////////////////////////////////////// + +// Сопоставляет уровень критичности из отчета ЕДТ и уровень критичности правила для сонара +// +// Параметры: +// Критичность - Строка - Уровень критичности замечания из ЕДТ +// +// Возвращаемое значение: +// Строка - Уровень критичности для правила в BSL LS +// +Функция Определить(Критичность) Экспорт + + Если Критичность = "Тривиальная" Тогда + + Возврат Информационное; + + ИначеЕсли Критичность = "Незначительная" Тогда + + Возврат Незначительное; + + ИначеЕсли Критичность = "Значительная" Тогда + + Возврат Важное; + + ИначеЕсли Критичность = "Критическая" Тогда + + Возврат Критическое; + + ИначеЕсли Критичность = "Ошибка конфигурации" Тогда + + Возврат Важное; + + Иначе + + Возврат Незначительное; + + КонецЕсли; + +КонецФункции + +Информационное = "INFO"; +Незначительное = "MINOR"; +Важное = "MAJOR"; +Критическое = "CRITICAL"; +Блокирующее = "BLOCKER"; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" new file mode 100644 index 0000000..ac505a8 --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -0,0 +1,119 @@ +#Использовать logos + +#Область ОписаниеПеременных + +Перем Лог; + +Перем Контекст; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Возвращает объект лог для фиксации сообщений +// +// Возвращаемое значение: +// logos.Лог - объект типа +// +Функция Лог() Экспорт + + Если Лог = Неопределено Тогда + Лог = Логирование.ПолучитьЛог(ИмяЛогаПриложения()); + КонецЕсли; + + Возврат Лог; + +КонецФункции + +// Устанавливает место, откуда будут читаться старые замечания и записываться новые. +// +// Параметры: +// ПутьКФайлу - Строка - Путь к внешнему файлу правил +// +Процедура УстановитьКонтекстСохранения(Знач ПутьКФайлу) Экспорт + + Если ЗначениеЗаполнено(ПутьКФайлу) Тогда + Контекст = ПутьКФайлу; + + Иначе + Контекст = ЛокальныйКонтекст(); + КонецЕсли; + + Лог().Информация("Установлен контекст сохранения замечаний %1", Контекст); + +КонецПроцедуры + +// Устанавливает способ сохранения замечаний и возвращает выбранный контекст +// +// Возвращаемое значение: +// Строка - контекст для работы с сохранением правил +// +Функция ПолучитьКонтекст() Экспорт + + Если Контекст = Неопределено Тогда + УстановитьКонтекстСохранения(Неопределено); + КонецЕсли; + + Возврат Контекст; + +КонецФункции + +// Путь к локальному файлу с сохраненными правилами +// +// Возвращаемое значение: +// Строка - Путь к файлу +// +Функция ЛокальныйКонтекст() Экспорт + + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "../..", "custom-rules.json"); + +КонецФункции + +// Возвращает имя лога приложения +// +// Возвращаемое значение: +// Строка - Имя лога +// +Функция ИмяЛогаПриложения() Экспорт + Возврат "oscript.app." + ИмяПриложения(); +КонецФункции + +// Возвращает имя приложения +// +// Возвращаемое значение: +// Строка - Имя приложения +// +Функция ИмяПриложения() Экспорт + + Возврат "edt-ripper"; + +КонецФункции + +// Версия приложения +// +// Возвращаемое значение: +// Строка - Строка с версией приложения +// +Функция Версия() Экспорт + + Возврат "22.09"; + +КонецФункции + +// Устанавливает режим отладки для логирования приложения +// +// Параметры: +// РежимОтладки - Булево - Если Истина отладка включается, если ложь - выключается +// +Процедура УстановитьРежимОтладки(Знач РежимОтладки) Экспорт + + Если РежимОтладки Тогда + + Лог().УстановитьУровень(УровниЛога.Отладка); + Лог.Отладка("Установлен уровень логов ОТЛАДКА"); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\321\201\320\265\321\200\320\236\321\210\320\270\320\261\320\276\320\272.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\321\201\320\265\321\200\320\236\321\210\320\270\320\261\320\276\320\272.os" new file mode 100644 index 0000000..6d02dfc --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\321\201\320\265\321\200\320\236\321\210\320\270\320\261\320\276\320\272.os" @@ -0,0 +1,245 @@ +#Область ОписаниеПеременных + +Перем КешПрочитанныхФайлов; +Перем Лог; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Разбирает отчет из ЕДТ и формирует отчет в формате bsl ls +// +// Параметры: +// Файл - Строка - Путь к файлу, результату работы ЕДТ +// ПутьКРепозиторию - Строка - Путь к репозиторию с проектами +// СписокПроектов - Массив - Список проектов в репозитории +// ФайлРезультата - Строка - Файл, куда будет записан отчет +// ПутиКакВЛинукс - Строка - Использовать пути как в линукс в отчете +// +Процедура Прочитать(Файл, ПутьКРепозиторию, СписокПроектов, ФайлРезультата, ПутиКакВЛинукс) Экспорт + + Чтение = Новый ЧтениеТекста; + Чтение.Открыть(Файл, "UTF-8", , , Ложь); + + Строка = Чтение.ПрочитатьСтроку(); + Отчет = Новый ГенераторОтчетовBSL(); + + ВыражениеУбратьКавычки = Новый РегулярноеВыражение("(\s*[:\[][\S\s]+)"); + ВыражениеУбратьКавычки2 = Новый РегулярноеВыражение("(\s\([\S\s]+?\))"); + ВыражениеУбратьКавычки3 = Новый РегулярноеВыражение("(\s*(?>""'|[""'])[\S\s]*?(?>'""|['""]))"); + + МассивДобавлений = Новый Соответствие; + ХранилищеПравил = Новый ХранилищеПравил; + + // проверка EDT могла быть запущена по мультипроектам с одним файлом результата(напр. конфа + расширения) + ГенераторыПутей = ИнициализироватьГенераторы(ПутьКРепозиторию, СписокПроектов); + + Пока Строка <> Неопределено Цикл + + СыроеЗамечание = РазобратьЗамечаниеВСтруктуру(Строка); + + Если СтрНачинаетсяС(СыроеЗамечание.Сообщение, "[BSL LS]") Тогда + Строка = Чтение.ПрочитатьСтроку(); + Продолжить; + КонецЕсли; + + ГенераторПутей = ГенераторыПутей.Получить(СыроеЗамечание.Проект); + + Если ГенераторПутей = Неопределено Тогда + //Выкинуть в лог? + ВызватьИсключение "Неизвестный проект " + СыроеЗамечание.Проект + "Невозможно подобрать путь"; + КонецЕсли; + + Позиция = НайтиПозициюВСтрокеЗамечания(СыроеЗамечание.Позиция); + + МетаданныеЗамечания = ""; + ЗамечаниеПеренесено = Ложь; + + Если Позиция = Неопределено Тогда // это не модуль + + МетаданныеЗамечания = Конфигурация.ПодобратьМодуль(ГенераторПутей, СыроеЗамечание.Объект); + ЗамечаниеПеренесено = Истина; + + Иначе + МетаданныеЗамечания = СыроеЗамечание.Объект; + КонецЕсли; + + ОбъектЗамечания = Конфигурация.НормализованныйПутьКОбъектуКонфигурации(ГенераторПутей, МетаданныеЗамечания, ПутиКакВЛинукс); + + Если ЗамечаниеПеренесено Тогда + Позиция = ПолучитьЗначимуюСтроку(ОбъектЗамечания); + КонецЕсли; + + Замечание = Отчет.НовыйЗамечаниеДляОбъекта(ОбъектЗамечания); + + //Описание замечания берется из выхлопа EDT + Замечание.message = ?(ЗамечаниеПеренесено, СыроеЗамечание.РасширенноеСообщение, СыроеЗамечание.Сообщение); + + // Диапазон срабатывания - позиция вычисленная ранее + Замечание.range.start.line = Позиция - 1; + Замечание.range.start.character = 0; + Замечание.range.end.line = Позиция - 1; + Замечание.range.end.character = 1; + + // Определение кода события. Изначально если присутствует берется из EDT. + // Отсутствующий код берется из файла правил сонар. + КодПравила = СыроеЗамечание.Код; + + Имя = ВыражениеУбратьКавычки.Заменить(СыроеЗамечание.Сообщение, ""); + Имя = ВыражениеУбратьКавычки3.Заменить(Имя, ""); + Имя = СокрЛП(ВыражениеУбратьКавычки2.Заменить(Имя, ""));; + + Код = НайтиСоздатьПравило(ХранилищеПравил, КодПравила, Имя,СыроеЗамечание.Тип, СыроеЗамечание, МассивДобавлений); + + Замечание.code = Код; + + Строка = Чтение.ПрочитатьСтроку(); + КонецЦикла; + Чтение.Закрыть(); + + Добавлено = МассивДобавлений.Количество(); + Если Добавлено Тогда + ХранилищеПравил.Дополнить(МассивДобавлений); + КонецЕсли; + + Отчет.ЗаписатьОтчет(ФайлРезультата); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция НайтиСоздатьПравило(ХранилищеПравил, КодПравила, Имя, Тип, Важность, МассивДобавлений) + + СтрокаПоиска = ""; + Если ЗначениеЗаполнено(КодПравила) Тогда + СтрокаПоиска = КодПравила; + Иначе + СтрокаПоиска = Имя; + КонецЕсли; + + Правило = ХранилищеПравил.НайтиПоКоду(СтрокаПоиска); + + ПравилоОтсутствуетВХранилище = Правило = Неопределено; + НовоеПравило = МассивДобавлений.Получить(СтрокаПоиска); + + Если НовоеПравило <> Неопределено Тогда + + Возврат НовоеПравило.Code; + + ИначеЕсли ПравилоОтсутствуетВХранилище Тогда + + НовоеПравило = ХранилищеПравил.НовыйПравило(СтрокаПоиска, Имя, ТипыЗамечаний.Определить(Тип), КритичностьЗамечаний.Определить(Важность)); + НовоеПравило.Code = "EDT" + "-" + (ХранилищеПравил.Количество() + МассивДобавлений.Количество() + 1); + МассивДобавлений.Вставить(СтрокаПоиска, НовоеПравило); + + Возврат НовоеПравило.Code; + + Иначе + Возврат Правило.Code; + КонецЕсли; + +КонецФункции + +Функция ИнициализироватьГенераторы(Репо, Проекты) + + Генераторы = Новый Соответствие(); + + Для Каждого Проект Из Проекты Цикл + + Путь = ОбъединитьПути(Репо, Проект, "src"); + ПараметрыПриложения.Лог().Отладка("Использован путь проекта %1", Путь); + Генераторы.Вставить(Проект, Новый Путь1СПоМетаданным(Путь)); + КонецЦикла; + + Возврат Генераторы; + +КонецФункции + +Функция НайтиПозициюВСтрокеЗамечания(Позиция) + + НайденаяПозиция = Неопределено; + + Если ЗначениеЗаполнено(Позиция) Тогда + + Попытка + НайденаяПозиция = Число(СтрЗаменить(Позиция, "строка ", "")); + Исключение + Попытка + НайденаяПозиция = Число(СтрЗаменить(Позиция, "line ", "")); + Исключение + НайденаяПозиция = Неопределено; + КонецПопытки; + КонецПопытки; + КонецЕсли; + + Возврат НайденаяПозиция; + +КонецФункции + +Функция ПолучитьЗначимуюСтроку(ПутьКФайлу) + + Если КешПрочитанныхФайлов.Получить(ПутьКФайлу) = Неопределено Тогда + ЗначимаяСтрока = ЗначимаяСтрокаФайла(ПутьКФайлу); + КешПрочитанныхФайлов.Вставить(ПутьКФайлу, ЗначимаяСтрока); + Возврат ЗначимаяСтрока; + Иначе; + Возврат КешПрочитанныхФайлов.Получить(ПутьКФайлу) + КонецЕсли; + +КонецФункции + +Функция ЗначимаяСтрокаФайла(ПутьКФайлу) + ЗначимаяСтрока = 0; + Текст = Новый ЧтениеТекста(); + + Попытка + + Текст.Открыть(ПутьКФайлу); + Строка = Текст.ПрочитатьСтроку(); + + Пока Строка <> Неопределено Цикл + + Если НЕ ПустаяСтрока(Строка) Тогда + Прервать; + КонецЕсли; + + ЗначимаяСтрока = ЗначимаяСтрока + 1; + Строка = Текст.ПрочитатьСтроку(); + КонецЦикла; + + Исключение + Текст.Закрыть(); + КонецПопытки; + + Текст.Закрыть(); + + ЗначимаяСтрока = ЗначимаяСтрока + 1; + + Возврат ЗначимаяСтрока; + +КонецФункции + +Функция РазобратьЗамечаниеВСтруктуру(Строка) + + ОписаниеЗамечания = СтрРазделить(Строка, Символы.Таб, Истина); + Замечание = Новый Структура; + Замечание.Вставить("Дата", ОписаниеЗамечания[0]); + Замечание.Вставить("Важность", ОписаниеЗамечания[1]); + Замечание.Вставить("Тип", ОписаниеЗамечания[2]); + Замечание.Вставить("Проект", ОписаниеЗамечания[3]); + Замечание.Вставить("Код", ОписаниеЗамечания[4]); + Замечание.Вставить("Объект", ОписаниеЗамечания[5]); + Замечание.Вставить("Позиция", ОписаниеЗамечания[6]); + Замечание.Вставить("Сообщение", ОписаниеЗамечания[7]); + Замечание.Вставить("РасширенноеСообщение", ОписаниеЗамечания[5] + "->" + ОписаниеЗамечания[7]); + + Возврат Замечание; + +КонецФункции; + +#КонецОбласти + +КешПрочитанныхФайлов = Новый Соответствие(); +Лог = ПараметрыПриложения.Лог(); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\227\320\260\320\274\320\265\321\207\320\260\320\275\320\270\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\227\320\260\320\274\320\265\321\207\320\260\320\275\320\270\320\271.os" new file mode 100644 index 0000000..d61e4ab --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\227\320\260\320\274\320\265\321\207\320\260\320\275\320\270\320\271.os" @@ -0,0 +1,55 @@ +Перем Ошибка Экспорт; +Перем ДефектКода Экспорт; +Перем Уязвимость Экспорт; + +/////////////////////////////////////////////////////////////////////////////// + +// Сопоставляет тип замечания из отчета ЕДТ и тип замечания для правила сонара +// +// Параметры: +// ТипЗамечания - Строка - Тип замечания из ЕДТ +// +// Возвращаемое значение: +// Строка - Подобраный тип замечания для правила в BSL LS +// +Функция Определить(ТипЗамечания) Экспорт + + Если ТипЗамечания = "Производительность" Тогда + + Возврат Ошибка; + + ИначеЕсли ТипЗамечания = "Переносимость" Тогда + + Возврат ДефектКода; + + ИначеЕсли ТипЗамечания = "Предупреждение" Тогда + + Возврат ДефектКода; + + ИначеЕсли ТипЗамечания = "Ошибка конфигурации" Тогда + + Возврат Ошибка; + + ИначеЕсли ТипЗамечания = "Стандарты кодирования" Тогда + + Возврат ДефектКода; + + ИначеЕсли ТипЗамечания = "Безопасность" Тогда + + Возврат Уязвимость; + + ИначеЕсли ТипЗамечания = "Стандарты разработки интерфейсов" Тогда + + Возврат Ошибка; + + Иначе + + Возврат ДефектКода; + + КонецЕсли; + +КонецФункции + +Ошибка = "BUG"; +ДефектКода = "CODE_SMELL"; +Уязвимость = "VULNERABILITY"; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" new file mode 100644 index 0000000..9ba95ef --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -0,0 +1,106 @@ +#Область ПрограммныйИнтерфейс + +// Читает json файл и преобразует его в объект +// +// Параметры: +// ПутьКФайлу - Строка - Путь к файлу, который будет прочитан +// ВСоответствие - Булево - От значения параметра зависит в какой тип будет происходить чтение +// +// Возвращаемое значение: +// Соответствие,Структура - Объект из json файла +// +Функция ПрочитатьОбъект(ПутьКФайлу, ВСоответствие = Истина) Экспорт + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.ОткрытьФайл(ПутьКФайлу, "UTF-8"); + Объект = ПрочитатьJSON(ЧтениеJSON, ВСоответствие); + ЧтениеJSON.Закрыть(); + Возврат Объект; +КонецФункции + +// Записывает произвольный объект в json файл +// +// Параметры: +// ПутьКФайлу - Строка - Путь json файлу +// ОбъектЗаписи - Объект - Объект для серриализации +// +Процедура ЗаписатьОбъект(ПутьКФайлу, ОбъектЗаписи) Экспорт + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.ОткрытьФайл(ПутьКФайлу, "UTF-8", , Новый ПараметрыЗаписиJSON(, Символы.Таб)); + ЗаписатьJSON(ЗаписьJSON, ОбъектЗаписи); + ЗаписьJSON.Закрыть(); + +КонецПроцедуры + +// Находит шаблон для отчета +// +// Возвращаемое значение: +// Строка - путь к файлу с шаблоном отчета +// +Функция РесурсОтчет() Экспорт + + Возврат ОбъединитьПути(Ресурсы(), "report.json"); + +КонецФункции + +// Находит шаблон замечания +// +// Возвращаемое значение: +// Строка - Путь к шаблону замечания +// +Функция РесурсЗамечание() Экспорт + + Возврат ОбъединитьПути(Ресурсы(), "diagnostic.json"); + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Находит путь к каталогу с ресурсами +// +// Возвращаемое значение: +// Строка - путь к каталогу с ресурсами +// +Функция Ресурсы() Экспорт + + Возврат ОбъединитьПути(КаталогИсходников(), ДиректорияРесурсов()); + +КонецФункции + +// Находит путь к каталогу исходных файлов программы +// +// Возвращаемое значение: +// Строка - Каталог исходных файлов программы +// +Функция КаталогИсходников() Экспорт + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, ".."); +КонецФункции + +// Находит путь к корневому каталогу программы +// +// Возвращаемое значение: +// Строка - Путь к корневому каталогу программы +// +Функция КаталогПрограммы() Экспорт + Возврат ОбъединитьПути(КаталогИсходников(), ".."); +КонецФункции + +// Находит внутренний файл правил +// +// Возвращаемое значение: +// Строка - Путь к внутреннему файлу правил +// +Функция ФайлПравилПрограммы() Экспорт + Возврат ОбъединитьПути(КаталогПрограммы(), "custom-rules.json"); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ДиректорияРесурсов() + Возврат "Ресурсы"; +КонецФункции + +#КонецОбласти diff --git "a/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/diagnostic.json" "b/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/diagnostic.json" new file mode 100644 index 0000000..c32b6ab --- /dev/null +++ "b/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/diagnostic.json" @@ -0,0 +1,17 @@ +{ + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "severity": "Information", + "code": "", + "source": "edt-rules", + "message": "", + "relatedInformation": null +} \ No newline at end of file diff --git "a/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/fileinfo.json" "b/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/fileinfo.json" new file mode 100644 index 0000000..0a9e7b1 --- /dev/null +++ "b/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/fileinfo.json" @@ -0,0 +1,4 @@ +{ + "diagnostics": [ + ] +} \ No newline at end of file diff --git "a/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/report.json" "b/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/report.json" new file mode 100644 index 0000000..34964a1 --- /dev/null +++ "b/src/\320\240\320\265\321\201\321\203\321\200\321\201\321\213/report.json" @@ -0,0 +1,8 @@ +{ + "date": "", + "fileinfos": [ + ], + "fileinfos_dirty": { + + } +} \ No newline at end of file diff --git a/tasks/test.os b/tasks/test.os new file mode 100644 index 0000000..10059c3 --- /dev/null +++ b/tasks/test.os @@ -0,0 +1,82 @@ +#Использовать 1bdd +#Использовать 1testrunner +#Использовать fs + +Функция ПрогнатьТесты() + + Тестер = Новый Тестер; + Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec); + + ПутьКТестам = "tests"; + ПутьКОтчетуJUnit = "out"; + + ФС.ОбеспечитьПустойКаталог(ПутьКОтчетуJUnit); + + РезультатТестирования = Тестер.ТестироватьКаталог( + Новый Файл(ПутьКТестам), + Новый Файл(ПутьКОтчетуJUnit) + ); + + Успешно = РезультатТестирования = 0; + + Возврат Успешно; +КонецФункции // ПрогнатьТесты() + +Функция ПрогнатьФичи() + + ПутьОтчетаJUnit = ОбъединитьПути(ТекущийКаталог(), "out", "bdd-log.xml"); + + КаталогФич = ОбъединитьПути(".", "features"); + + Файл_КаталогФич = Новый Файл(КаталогФич); + + ИсполнительБДД = Новый ИсполнительБДД; + РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); + ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + + СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; + Если РезультатыВыполнения.Строки.Количество() > 0 Тогда + + СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + + КонецЕсли; + + ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; + ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); + + Сообщить(СтрШаблон("Результат прогона фич <%1> + |", ИтоговыйРезультатВыполнения)); + + Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался; +КонецФункции // ПрогнатьФичи() + +// основной код + +ТекКаталог = ТекущийКаталог(); + +Попытка + ТестыПрошли = ПрогнатьТесты(); +Исключение + ТестыПрошли = Ложь; + Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно + |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); +КонецПопытки; + +УстановитьТекущийКаталог(ТекКаталог); + +Попытка + ФичиПрошли = ПрогнатьФичи(); +Исключение + ФичиПрошли = Ложь; + Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно + |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); +КонецПопытки; + +Если Не ТестыПрошли Или Не ФичиПрошли Тогда + ВызватьИсключение "Тестирование завершилось неудачно!"; +Иначе + Сообщить(СтрШаблон("Результат прогона тестов <%1> + |", ТестыПрошли)); + Сообщить(СтрШаблон("Результат прогона основных фич <%1> + |", ФичиПрошли)); +КонецЕсли; diff --git "a/tests/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\236\321\202\321\207\320\265\321\202\320\276\320\262.os" "b/tests/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\236\321\202\321\207\320\265\321\202\320\276\320\262.os" new file mode 100644 index 0000000..dc542b9 --- /dev/null +++ "b/tests/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\236\321\202\321\207\320\265\321\202\320\276\320\262.os" @@ -0,0 +1,57 @@ +#Использовать asserts +#Использовать logos +#Использовать tempfiles +#Использовать "../src" + +Перем юТест; +Перем Лог; +Перем МенеджерВременныхФайлов; + +// Основная точка входа +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + ПередЗапускомТестов(); + + юТест = ЮнитТестирование; + + ВсеТесты = Новый Массив; + + ВсеТесты.Добавить("Тест_ГенераторОтчетов"); + + Возврат ВсеТесты; + +КонецФункции + +Процедура ПередЗапускомТестов() + + Попытка + ВремТестер = Новый Тестер; + Лог = Логирование.ПолучитьЛог(ВремТестер.ИмяЛога()); + Исключение + Лог = Логирование.ПолучитьЛог("Test"); + КонецПопытки; + +КонецПроцедуры + +Процедура ПередЗапускомТеста() Экспорт + + ПараметрыПриложения.УстановитьРежимОтладки(); + + МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов; + +КонецПроцедуры + + +Процедура ПослеЗапускаТеста() Экспорт + + МенеджерВременныхФайлов.Удалить(); + МенеджерВременныхФайлов = Неопределено; + +КонецПроцедуры + +Процедура Тест_ГенераторОтчетов() Экспорт + + Отчет = Новый ГенераторОтчетовBSL(); + + Ожидаем.Что(ЗначениеЗаполнено(Отчет.Получить("date"))).ЭтоИстина(); +КонецПроцедуры diff --git "a/tests/\320\237\320\260\321\200\321\201\320\265\321\200\320\236\321\210\320\270\320\261\320\276\320\272.os" "b/tests/\320\237\320\260\321\200\321\201\320\265\321\200\320\236\321\210\320\270\320\261\320\276\320\272.os" new file mode 100644 index 0000000..e69de29 diff --git "a/tests/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/tests/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" new file mode 100644 index 0000000..cd61648 --- /dev/null +++ "b/tests/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\265\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -0,0 +1,72 @@ +#Использовать asserts +#Использовать logos +#Использовать tempfiles +#Использовать fs +#Использовать "../src" + +Перем юТест; +Перем Лог; +Перем МенеджерВременныхФайлов; + +// Основная точка входа +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + ПередЗапускомТестов(); + + юТест = ЮнитТестирование; + + ВсеТесты = Новый Массив; + + ВсеТесты.Добавить("Тест_ПолучениеРесурсов"); + ВсеТесты.Добавить("Тест_СериализацияИДесериализация"); + + Возврат ВсеТесты; + +КонецФункции + +Процедура ПередЗапускомТестов() + + Попытка + ВремТестер = Новый Тестер; + Лог = Логирование.ПолучитьЛог(ВремТестер.ИмяЛога()); + Исключение + Лог = Логирование.ПолучитьЛог("Test"); + КонецПопытки; + +КонецПроцедуры + +Процедура ПередЗапускомТеста() Экспорт + + ПараметрыПриложения.УстановитьРежимОтладки(); + + МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов; + +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + + МенеджерВременныхФайлов.Удалить(); + МенеджерВременныхФайлов = Неопределено; + +КонецПроцедуры + +Процедура Тест_ПолучениеРесурсов() Экспорт + + Файл = Новый Файл(ФайловыеОперации.Ресурсы()); + + Ожидаем.Что(Файл.Существует(), "Директории не существует").ЭтоИстина(); + Ожидаем.Что(Файл.ЭтоКаталог(), "Не является директорией").ЭтоИстина(); + Ожидаем.Что(НайтиФайлы(ФайловыеОперации.Ресурсы(), "*.json").Количество(), "Изменилось количество ресурсов").Равно(4); + +КонецПроцедуры + +Процедура Тест_СериализацияИДесериализация() Экспорт + + ПутьКФайлу = МенеджерВременныхФайлов.СоздатьФайл("test.json"); + + Объект = ФайловыеОперации.ПрочитатьОбъект(ФайловыеОперации.РесурсОтчет(), Истина); + Ожидаем.Что(ТипЗнч(Объект), "Типы не совпали").Равно(Тип("Соответствие")); + + ФайловыеОперации.ЗаписатьОбъект(ПутьКФайлу, Объект); + +КонецПроцедуры diff --git "a/tests/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\237\321\200\320\260\320\262\320\270\320\273.os" "b/tests/\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\237\321\200\320\260\320\262\320\270\320\273.os" new file mode 100644 index 0000000..e69de29 diff --git a/v8config.json b/v8config.json new file mode 100644 index 0000000..000735c --- /dev/null +++ b/v8config.json @@ -0,0 +1,23 @@ +{ + "Precommt4onecСценарии": { + "ИспользоватьСценарииРепозитория": false, + "КаталогЛокальныхСценариев": "", + "ГлобальныеСценарии": [ + "ЗапретИспользованияПерейти.os", + "УдалениеЛишнихПустыхСтрок.os", + "ПроверкаДублейПроцедурИФункций.os", + "ДобавлениеПробеловПередКлючевымиСловами.os", + "ПроверкаКорректностиИнструкцийПрепроцессора.os", + "ПроверкаКорректностиОбластей.os", + "ИсправлениеНеКаноническогоНаписания.os", + "УдалениеЛишнихКонцевыхПробелов.os" + ], + "ОтключенныеСценарии": [], + "НастройкиСценариев": { + "СортировкаДереваМетаданных": { + "УчитываяПрефикс": "" + } + }, + "Проекты": {} + } +} \ No newline at end of file