-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlog_buckets.py
More file actions
156 lines (130 loc) · 7.18 KB
/
log_buckets.py
File metadata and controls
156 lines (130 loc) · 7.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# -*- coding: utf-8 -*-
"""Корзины логов для оркестратора и pyRevit-скриптов.
Назначение:
- Дать унифицированный API для накопления строк-предупреждений/ошибок
и последующей записи в текстовые логи.
Контракты:
- Запись выполняется через utils.logs.write_log_lines().
- Имена файлов логов согласованы с константами config.constants:
* Оркестратор (tasks):
- LOGFILE_VERSION_NOT_FOUND
- LOGFILE_VERSION_TOO_NEW
* pyRevit-скрипт (экспорт IFC):
- LOGFILE_OPENING_ERRORS
- LOGFILE_EXPORT_ERRORS
- Имя LOGFILE_MISSING_VIEW (лог моделей без 3D-вида с именем из
настроек [Revit] export_view3d_name) вычисляется из шаблона
LOGFILE_MISSING_VIEW_TEMPLATE через
utils.files.format_log_name_with_view().
Особенности:
- Модуль может выполняться под IronPython 3.4 (pyRevit).
- Допускается использование модуля typing для аннотаций типов, но без
современного синтаксиса, требующего более новых версий Python
(list[str], X | Y и т.п.) в исполняемом коде.
"""
from pathlib import Path
from config.constants import (
LOGFILE_EXPORT_ERRORS,
LOGFILE_OPENING_ERRORS,
LOGFILE_VERSION_TOO_NEW,
LOGFILE_VERSION_NOT_FOUND,
)
from utils.logs import write_log_lines
from utils.files import format_log_name_with_view
# Имя лог-файла моделей без 3D-вида для экспорта IFC
# (шаблон + имя вида из настроек [Revit] export_view3d_name).
LOGFILE_MISSING_VIEW = format_log_name_with_view()
class TasksLogBucket(object):
"""Корзина логов для этапа оркестрации (формирование задач/CSV).
Поля:
version_not_found: кейсы, где не определилась версия Revit.
version_too_new: кейсы, где версия выше поддерживаемого диапазона.
"""
__slots__ = ("version_not_found", "version_too_new")
def __init__(self) -> None:
"""Создаёт пустую корзину логов задач.
Инициализирует списки:
- version_not_found;
- version_too_new.
"""
# Список строк с моделями, для которых не удалось определить версию.
self.version_not_found = []
# Список строк с моделями, у которых версия выше поддерживаемого
# диапазона (слишком новый Revit).
self.version_too_new = []
def write_logs(self, log_dir: Path) -> None:
"""Записывает накопленные кейсы в датированные файлы логов.
:param log_dir: Директория, в которую будут записаны txt-логи.
"""
if self.version_not_found:
# sorted(...) — детерминированный вывод: порядок в логе
# не зависит от порядка накопления сообщений.
write_log_lines(
log_dir,
LOGFILE_VERSION_NOT_FOUND,
sorted(self.version_not_found),
)
if self.version_too_new:
# Та же идея: сортируем для предсказуемого порядка в логе.
write_log_lines(
log_dir,
LOGFILE_VERSION_TOO_NEW,
sorted(self.version_too_new),
)
class PyRevitExportLogBucket(object):
"""Корзина логов для pyRevit-скрипта экспорта IFC.
Поля:
opening_errors: модели, которые не открылись в Revit.
missing_navisview: модели без 3D-вида с именем из настроек
([Revit] export_view3d_name).
export_errors: модели, экспорт которых завершился с ошибкой.
"""
__slots__ = ("opening_errors", "missing_navisview", "export_errors")
def __init__(self) -> None:
"""Создаёт пустую корзину логов pyRevit-скрипта.
Инициализирует списки:
- opening_errors;
- missing_navisview;
- export_errors.
"""
# Список строк с моделями, которые не удалось открыть в Revit.
self.opening_errors = []
# Список строк с моделями без 3D-вида с именем из настроек
# (раздел [Revit], параметр export_view3d_name).
self.missing_navisview = []
# Список строк с моделями, экспорт которых завершился с ошибкой
# (сбои внутри Revit API, doc.Export и т.п.).
self.export_errors = []
def write_logs(self, log_dir: Path) -> None:
"""Записывает накопленные кейсы в датированные файлы логов.
Важно:
- pyRevit-процесс может запускаться отдельно для каждой версии
Revit, поэтому здесь мы только дописываем строки без
разделителей; финальный разделитель на запуск оркестратора
добавляется в ExportOrchestrator._finalize_pyrevit_logs().
:param log_dir: Директория, в которую будут записаны txt-логи.
"""
if self.opening_errors:
# separator="" — не отбиваем блоки по каждой версии Revit;
# разделитель добавляется один раз на запуск оркестратора.
# sorted(...) — детерминированный порядок строк.
write_log_lines(
log_dir,
LOGFILE_OPENING_ERRORS,
sorted(self.opening_errors),
separator="",
)
if self.missing_navisview:
write_log_lines(
log_dir,
LOGFILE_MISSING_VIEW,
sorted(self.missing_navisview),
separator="", # та же схема: блоки ставит оркестратор
)
if self.export_errors:
write_log_lines(
log_dir,
LOGFILE_EXPORT_ERRORS,
sorted(self.export_errors),
separator="", # отдельно фиксируем ошибки экспорта
)