arxo-codegen 0.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- arxo_codegen/__init__.py +5 -0
- arxo_codegen/__main__.py +7 -0
- arxo_codegen/active-outcomes.json +6837 -0
- arxo_codegen/check.py +158 -0
- arxo_codegen/check_active_canaries.py +262 -0
- arxo_codegen/check_api.py +76 -0
- arxo_codegen/check_conformance.py +414 -0
- arxo_codegen/check_matrix.py +131 -0
- arxo_codegen/check_packages.py +281 -0
- arxo_codegen/check_semantic_probes.py +293 -0
- arxo_codegen/check_xlsx.py +320 -0
- arxo_codegen/consumer_runner.py +316 -0
- arxo_codegen/core_support.py +203 -0
- arxo_codegen/coverage.py +341 -0
- arxo_codegen/deliver.py +180 -0
- arxo_codegen/examples/xlsx/pricing.lawir.json +409 -0
- arxo_codegen/examples/xlsx/pricing.xlsx.json +52 -0
- arxo_codegen/excel_plan.py +602 -0
- arxo_codegen/harness/verify/ci/gates/backends/check_backends.py +1248 -0
- arxo_codegen/harness/verify/ci/gates/backends/l1_fixtures.py +463 -0
- arxo_codegen/inert-nodes.json +62 -0
- arxo_codegen/inert.py +91 -0
- arxo_codegen/inputs.py +59 -0
- arxo_codegen/package.py +565 -0
- arxo_codegen/plan.py +4053 -0
- arxo_codegen/recertify_registry.py +100 -0
- arxo_codegen/runtime-cert.json +5259 -0
- arxo_codegen/runtime_cert.py +233 -0
- arxo_codegen/survey.py +272 -0
- arxo_codegen/target_runner.py +101 -0
- arxo_codegen/targets/bsl/cert.bsl +113 -0
- arxo_codegen/targets/bsl/emit.py +356 -0
- arxo_codegen/targets/bsl/json.bsl +243 -0
- arxo_codegen/targets/bsl/runner.bsl +210 -0
- arxo_codegen/targets/bsl/runtime.bsl +858 -0
- arxo_codegen/targets/cs/Cert.cs +90 -0
- arxo_codegen/targets/cs/Runner.cs +154 -0
- arxo_codegen/targets/cs/Runtime.cs +243 -0
- arxo_codegen/targets/cs/emit.py +223 -0
- arxo_codegen/targets/dart/cert.dart +99 -0
- arxo_codegen/targets/dart/emit.py +206 -0
- arxo_codegen/targets/dart/json.dart +166 -0
- arxo_codegen/targets/dart/runner.dart +154 -0
- arxo_codegen/targets/dart/runtime.dart +293 -0
- arxo_codegen/targets/erl/cert.erl +64 -0
- arxo_codegen/targets/erl/emit.py +216 -0
- arxo_codegen/targets/erl/rt.erl +238 -0
- arxo_codegen/targets/erl/runner.erl +130 -0
- arxo_codegen/targets/ex/cert.exs +62 -0
- arxo_codegen/targets/ex/emit.py +204 -0
- arxo_codegen/targets/ex/runner.exs +124 -0
- arxo_codegen/targets/ex/runtime.ex +227 -0
- arxo_codegen/targets/go/apiBase.go +483 -0
- arxo_codegen/targets/go/apicheck.go +97 -0
- arxo_codegen/targets/go/cert.go +218 -0
- arxo_codegen/targets/go/emit.py +1806 -0
- arxo_codegen/targets/go/evaluate.go +1826 -0
- arxo_codegen/targets/go/runner.go +38 -0
- arxo_codegen/targets/go/runtime.go +2612 -0
- arxo_codegen/targets/java/Cert.java +91 -0
- arxo_codegen/targets/java/Json.java +148 -0
- arxo_codegen/targets/java/Runner.java +151 -0
- arxo_codegen/targets/java/Runtime.java +243 -0
- arxo_codegen/targets/java/emit.py +198 -0
- arxo_codegen/targets/kt/Cert.kt +67 -0
- arxo_codegen/targets/kt/Json.kt +103 -0
- arxo_codegen/targets/kt/Runner.kt +126 -0
- arxo_codegen/targets/kt/Runtime.kt +196 -0
- arxo_codegen/targets/kt/emit.py +195 -0
- arxo_codegen/targets/lua/cert.lua +82 -0
- arxo_codegen/targets/lua/emit.py +250 -0
- arxo_codegen/targets/lua/json.lua +133 -0
- arxo_codegen/targets/lua/runner.lua +167 -0
- arxo_codegen/targets/lua/runtime.lua +541 -0
- arxo_codegen/targets/php/cert.php +84 -0
- arxo_codegen/targets/php/emit.py +229 -0
- arxo_codegen/targets/php/json.php +144 -0
- arxo_codegen/targets/php/runner.php +189 -0
- arxo_codegen/targets/php/runtime.php +660 -0
- arxo_codegen/targets/py/api_base.py +334 -0
- arxo_codegen/targets/py/apicheck.py +51 -0
- arxo_codegen/targets/py/cert.py +140 -0
- arxo_codegen/targets/py/emit.py +1140 -0
- arxo_codegen/targets/py/evaluate.py +980 -0
- arxo_codegen/targets/py/runner.py +38 -0
- arxo_codegen/targets/py/runtime.py +1634 -0
- arxo_codegen/targets/rb/cert.rb +73 -0
- arxo_codegen/targets/rb/emit.py +203 -0
- arxo_codegen/targets/rb/runner.rb +130 -0
- arxo_codegen/targets/rb/runtime.rb +255 -0
- arxo_codegen/targets/rs/Cargo.lock +142 -0
- arxo_codegen/targets/rs/Cargo.toml +16 -0
- arxo_codegen/targets/rs/cert.rs +106 -0
- arxo_codegen/targets/rs/emit.py +233 -0
- arxo_codegen/targets/rs/prefetch.rs +1 -0
- arxo_codegen/targets/rs/runner.rs +181 -0
- arxo_codegen/targets/rs/runtime.rs +448 -0
- arxo_codegen/targets/scala/Cert.scala +77 -0
- arxo_codegen/targets/scala/Json.scala +140 -0
- arxo_codegen/targets/scala/Runner.scala +121 -0
- arxo_codegen/targets/scala/Runtime.scala +269 -0
- arxo_codegen/targets/scala/emit.py +193 -0
- arxo_codegen/targets/swift/cert.swift +105 -0
- arxo_codegen/targets/swift/emit.py +231 -0
- arxo_codegen/targets/swift/json.swift +208 -0
- arxo_codegen/targets/swift/runner.swift +133 -0
- arxo_codegen/targets/swift/runtime.swift +528 -0
- arxo_codegen/targets/ts/apiBase.ts +250 -0
- arxo_codegen/targets/ts/apicheck.ts +37 -0
- arxo_codegen/targets/ts/cert.ts +96 -0
- arxo_codegen/targets/ts/emit.py +1214 -0
- arxo_codegen/targets/ts/evaluate.ts +894 -0
- arxo_codegen/targets/ts/package-lock.json +45 -0
- arxo_codegen/targets/ts/package.json +9 -0
- arxo_codegen/targets/ts/runner.ts +31 -0
- arxo_codegen/targets/ts/runtime.ts +1369 -0
- arxo_codegen/targets/xlsx/README.ru.md +176 -0
- arxo_codegen/targets/xlsx/emit.py +198 -0
- arxo_codegen/temporal.py +59 -0
- arxo_codegen/test_alias_types.py +171 -0
- arxo_codegen/test_api_contract.py +89 -0
- arxo_codegen/test_calendar_policy.py +48 -0
- arxo_codegen/test_check.py +49 -0
- arxo_codegen/test_check_active_canaries.py +96 -0
- arxo_codegen/test_check_conformance.py +132 -0
- arxo_codegen/test_check_semantic_probes.py +85 -0
- arxo_codegen/test_check_xlsx.py +52 -0
- arxo_codegen/test_consumer_runner.py +175 -0
- arxo_codegen/test_core_support.py +80 -0
- arxo_codegen/test_e0212_decision_time.py +63 -0
- arxo_codegen/test_head_aggregate.py +71 -0
- arxo_codegen/test_inert.py +143 -0
- arxo_codegen/test_instant_types.py +113 -0
- arxo_codegen/test_key_conflict_scope.py +92 -0
- arxo_codegen/test_key_conflict_targets.py +17 -0
- arxo_codegen/test_package_layout.py +163 -0
- arxo_codegen/test_plan_language_version.py +44 -0
- arxo_codegen/test_positions_refusal.py +43 -0
- arxo_codegen/test_recertify_registry.py +77 -0
- arxo_codegen/test_ruby_target.py +41 -0
- arxo_codegen/test_runtime_cert.py +83 -0
- arxo_codegen/test_secondary_key_conflict_scope.py +17 -0
- arxo_codegen/test_stage_r.py +108 -0
- arxo_codegen/test_standalone_inputs.py +71 -0
- arxo_codegen/test_support.py +150 -0
- arxo_codegen/test_survey_inputs.py +115 -0
- arxo_codegen-0.4.0.dist-info/LICENSE +202 -0
- arxo_codegen-0.4.0.dist-info/METADATA +1673 -0
- arxo_codegen-0.4.0.dist-info/RECORD +152 -0
- arxo_codegen-0.4.0.dist-info/WHEEL +5 -0
- arxo_codegen-0.4.0.dist-info/entry_points.txt +13 -0
- arxo_codegen-0.4.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// Разбор и печать JSON для BSL-бэкенда. ЧтениеJSON отдало бы число как Число:
|
|
2
|
+
// `0.000` теряло бы масштаб, а длинная запись переполнялась либо округлялась
|
|
3
|
+
// молча, — поэтому разбор свой и число остаётся ЗАПИСЬЮ (Структура
|
|
4
|
+
// {ЗаписьЧисла}). null — Null, объект — Соответствие (только поиск по ключу,
|
|
5
|
+
// порядок обхода не нужен), массив — Массив. Печать тоже своя: ЗаписьJSON
|
|
6
|
+
// вставляет переносы строк и по-разному экранирует у исполнителей.
|
|
7
|
+
|
|
8
|
+
Перем Т;
|
|
9
|
+
Перем Поз;
|
|
10
|
+
Перем Длина;
|
|
11
|
+
|
|
12
|
+
Процедура Ошибка(Что)
|
|
13
|
+
ВызватьИсключение "JSON: " + Что + " в позиции " + Поз;
|
|
14
|
+
КонецПроцедуры
|
|
15
|
+
|
|
16
|
+
Функция Код()
|
|
17
|
+
Если Поз > Длина Тогда
|
|
18
|
+
Возврат -1;
|
|
19
|
+
КонецЕсли;
|
|
20
|
+
Возврат КодСимвола(Т, Поз);
|
|
21
|
+
КонецФункции
|
|
22
|
+
|
|
23
|
+
Процедура Пропуск()
|
|
24
|
+
Пока Поз <= Длина Цикл
|
|
25
|
+
К = КодСимвола(Т, Поз);
|
|
26
|
+
Если К <> 32 И К <> 9 И К <> 10 И К <> 13 Тогда
|
|
27
|
+
Прервать;
|
|
28
|
+
КонецЕсли;
|
|
29
|
+
Поз = Поз + 1;
|
|
30
|
+
КонецЦикла;
|
|
31
|
+
КонецПроцедуры
|
|
32
|
+
|
|
33
|
+
Функция Шестнадцать(Запись)
|
|
34
|
+
Н = 0;
|
|
35
|
+
Для Инд = 1 По СтрДлина(Запись) Цикл
|
|
36
|
+
К = КодСимвола(Запись, Инд);
|
|
37
|
+
Если К >= 48 И К <= 57 Тогда
|
|
38
|
+
Н = Н * 16 + К - 48;
|
|
39
|
+
ИначеЕсли К >= 97 И К <= 102 Тогда
|
|
40
|
+
Н = Н * 16 + К - 87;
|
|
41
|
+
ИначеЕсли К >= 65 И К <= 70 Тогда
|
|
42
|
+
Н = Н * 16 + К - 55;
|
|
43
|
+
Иначе
|
|
44
|
+
Ошибка("плохой \u");
|
|
45
|
+
КонецЕсли;
|
|
46
|
+
КонецЦикла;
|
|
47
|
+
Возврат Н;
|
|
48
|
+
КонецФункции
|
|
49
|
+
|
|
50
|
+
Функция СтрокаJSON()
|
|
51
|
+
Поз = Поз + 1;
|
|
52
|
+
Рез = "";
|
|
53
|
+
Нач = Поз;
|
|
54
|
+
Пока Истина Цикл
|
|
55
|
+
К = Код();
|
|
56
|
+
Если К = -1 Тогда
|
|
57
|
+
Ошибка("строка не закрыта");
|
|
58
|
+
ИначеЕсли К = 34 Тогда
|
|
59
|
+
Рез = Рез + Сред(Т, Нач, Поз - Нач);
|
|
60
|
+
Поз = Поз + 1;
|
|
61
|
+
Возврат Рез;
|
|
62
|
+
ИначеЕсли К = 92 Тогда
|
|
63
|
+
Рез = Рез + Сред(Т, Нач, Поз - Нач);
|
|
64
|
+
Поз = Поз + 1;
|
|
65
|
+
Э = Код();
|
|
66
|
+
Если Э = 117 Тогда
|
|
67
|
+
Рез = Рез + Символ(Шестнадцать(Сред(Т, Поз + 1, 4)));
|
|
68
|
+
Поз = Поз + 5;
|
|
69
|
+
Иначе
|
|
70
|
+
Если Э = 110 Тогда
|
|
71
|
+
Рез = Рез + Символ(10);
|
|
72
|
+
ИначеЕсли Э = 116 Тогда
|
|
73
|
+
Рез = Рез + Символ(9);
|
|
74
|
+
ИначеЕсли Э = 114 Тогда
|
|
75
|
+
Рез = Рез + Символ(13);
|
|
76
|
+
ИначеЕсли Э = 98 Тогда
|
|
77
|
+
Рез = Рез + Символ(8);
|
|
78
|
+
ИначеЕсли Э = 102 Тогда
|
|
79
|
+
Рез = Рез + Символ(12);
|
|
80
|
+
ИначеЕсли Э = 34 Или Э = 92 Или Э = 47 Тогда
|
|
81
|
+
Рез = Рез + Символ(Э);
|
|
82
|
+
Иначе
|
|
83
|
+
Ошибка("плохой экран");
|
|
84
|
+
КонецЕсли;
|
|
85
|
+
Поз = Поз + 1;
|
|
86
|
+
КонецЕсли;
|
|
87
|
+
Нач = Поз;
|
|
88
|
+
Иначе
|
|
89
|
+
Поз = Поз + 1;
|
|
90
|
+
КонецЕсли;
|
|
91
|
+
КонецЦикла;
|
|
92
|
+
КонецФункции
|
|
93
|
+
|
|
94
|
+
Функция Значение()
|
|
95
|
+
Пропуск();
|
|
96
|
+
К = Код();
|
|
97
|
+
Если К = 123 Тогда
|
|
98
|
+
Об = Новый Соответствие;
|
|
99
|
+
Поз = Поз + 1;
|
|
100
|
+
Пропуск();
|
|
101
|
+
Если Код() = 125 Тогда
|
|
102
|
+
Поз = Поз + 1;
|
|
103
|
+
Возврат Об;
|
|
104
|
+
КонецЕсли;
|
|
105
|
+
Пока Истина Цикл
|
|
106
|
+
Пропуск();
|
|
107
|
+
Если Код() <> 34 Тогда
|
|
108
|
+
Ошибка("ожидался ключ");
|
|
109
|
+
КонецЕсли;
|
|
110
|
+
Ключ = СтрокаJSON();
|
|
111
|
+
Пропуск();
|
|
112
|
+
Если Код() <> 58 Тогда
|
|
113
|
+
Ошибка("ожидалось ':'");
|
|
114
|
+
КонецЕсли;
|
|
115
|
+
Поз = Поз + 1;
|
|
116
|
+
Об.Вставить(Ключ, Значение());
|
|
117
|
+
Пропуск();
|
|
118
|
+
К = Код();
|
|
119
|
+
Поз = Поз + 1;
|
|
120
|
+
Если К = 125 Тогда
|
|
121
|
+
Возврат Об;
|
|
122
|
+
ИначеЕсли К <> 44 Тогда
|
|
123
|
+
Ошибка("ожидалось ',' или '}'");
|
|
124
|
+
КонецЕсли;
|
|
125
|
+
КонецЦикла;
|
|
126
|
+
ИначеЕсли К = 91 Тогда
|
|
127
|
+
Мас = Новый Массив;
|
|
128
|
+
Поз = Поз + 1;
|
|
129
|
+
Пропуск();
|
|
130
|
+
Если Код() = 93 Тогда
|
|
131
|
+
Поз = Поз + 1;
|
|
132
|
+
Возврат Мас;
|
|
133
|
+
КонецЕсли;
|
|
134
|
+
Пока Истина Цикл
|
|
135
|
+
Мас.Добавить(Значение());
|
|
136
|
+
Пропуск();
|
|
137
|
+
К = Код();
|
|
138
|
+
Поз = Поз + 1;
|
|
139
|
+
Если К = 93 Тогда
|
|
140
|
+
Возврат Мас;
|
|
141
|
+
ИначеЕсли К <> 44 Тогда
|
|
142
|
+
Ошибка("ожидалось ',' или ']'");
|
|
143
|
+
КонецЕсли;
|
|
144
|
+
КонецЦикла;
|
|
145
|
+
ИначеЕсли К = 34 Тогда
|
|
146
|
+
Возврат СтрокаJSON();
|
|
147
|
+
ИначеЕсли Сред(Т, Поз, 4) = "true" Тогда
|
|
148
|
+
Поз = Поз + 4;
|
|
149
|
+
Возврат Истина;
|
|
150
|
+
ИначеЕсли Сред(Т, Поз, 5) = "false" Тогда
|
|
151
|
+
Поз = Поз + 5;
|
|
152
|
+
Возврат Ложь;
|
|
153
|
+
ИначеЕсли Сред(Т, Поз, 4) = "null" Тогда
|
|
154
|
+
Поз = Поз + 4;
|
|
155
|
+
Возврат Null;
|
|
156
|
+
КонецЕсли;
|
|
157
|
+
Нач = Поз;
|
|
158
|
+
Пока Поз <= Длина Цикл
|
|
159
|
+
К = КодСимвола(Т, Поз);
|
|
160
|
+
Если Не ((К >= 48 И К <= 57) Или К = 45 Или К = 43 Или К = 46 Или К = 101 Или К = 69) Тогда
|
|
161
|
+
Прервать;
|
|
162
|
+
КонецЕсли;
|
|
163
|
+
Поз = Поз + 1;
|
|
164
|
+
КонецЦикла;
|
|
165
|
+
Если Поз = Нач Тогда
|
|
166
|
+
Ошибка("неизвестное значение");
|
|
167
|
+
КонецЕсли;
|
|
168
|
+
Возврат Новый Структура("ЗаписьЧисла", Сред(Т, Нач, Поз - Нач));
|
|
169
|
+
КонецФункции
|
|
170
|
+
|
|
171
|
+
Функция Разобрать(Текст) Экспорт
|
|
172
|
+
Т = Текст;
|
|
173
|
+
Поз = 1;
|
|
174
|
+
Длина = СтрДлина(Т);
|
|
175
|
+
Если Длина > 0 И КодСимвола(Т, 1) = 65279 Тогда
|
|
176
|
+
Поз = 2;
|
|
177
|
+
КонецЕсли;
|
|
178
|
+
Рез = Значение();
|
|
179
|
+
Пропуск();
|
|
180
|
+
Если Поз <= Длина Тогда
|
|
181
|
+
Ошибка("лишнее после значения");
|
|
182
|
+
КонецЕсли;
|
|
183
|
+
Возврат Рез;
|
|
184
|
+
КонецФункции
|
|
185
|
+
|
|
186
|
+
Функция Прочитать(Путь) Экспорт
|
|
187
|
+
Чтение = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8);
|
|
188
|
+
Текст = Чтение.Прочитать();
|
|
189
|
+
Чтение.Закрыть();
|
|
190
|
+
Возврат Разобрать(?(Текст = Неопределено, "", Текст));
|
|
191
|
+
КонецФункции
|
|
192
|
+
|
|
193
|
+
// Поле объекта JSON; Неопределено, если это не объект, поля нет или оно null.
|
|
194
|
+
Функция Поле(Об, Ключ) Экспорт
|
|
195
|
+
Если ТипЗнч(Об) <> Тип("Соответствие") Тогда
|
|
196
|
+
Возврат Неопределено;
|
|
197
|
+
КонецЕсли;
|
|
198
|
+
З = Об.Получить(Ключ);
|
|
199
|
+
Если З = Null Тогда
|
|
200
|
+
Возврат Неопределено;
|
|
201
|
+
КонецЕсли;
|
|
202
|
+
Возврат З;
|
|
203
|
+
КонецФункции
|
|
204
|
+
|
|
205
|
+
// Текст значения JSON: строка как есть, число — его запись.
|
|
206
|
+
Функция Текст(З) Экспорт
|
|
207
|
+
Если ТипЗнч(З) = Тип("Строка") Тогда
|
|
208
|
+
Возврат З;
|
|
209
|
+
ИначеЕсли ТипЗнч(З) = Тип("Структура") Тогда
|
|
210
|
+
Возврат З.ЗаписьЧисла;
|
|
211
|
+
ИначеЕсли ТипЗнч(З) = Тип("Булево") Тогда
|
|
212
|
+
Возврат ?(З, "true", "false");
|
|
213
|
+
КонецЕсли;
|
|
214
|
+
Возврат "";
|
|
215
|
+
КонецФункции
|
|
216
|
+
|
|
217
|
+
// Строка печатается символами как есть, экранируются кавычка, экран и
|
|
218
|
+
// управляющие символы.
|
|
219
|
+
Функция ТекстJSON(С) Экспорт
|
|
220
|
+
Рез = """";
|
|
221
|
+
Нач = 1;
|
|
222
|
+
Для Инд = 1 По СтрДлина(С) Цикл
|
|
223
|
+
К = КодСимвола(С, Инд);
|
|
224
|
+
Если К = 34 Или К = 92 Или К < 32 Тогда
|
|
225
|
+
Рез = Рез + Сред(С, Нач, Инд - Нач);
|
|
226
|
+
Если К = 34 Тогда
|
|
227
|
+
Рез = Рез + "\""";
|
|
228
|
+
ИначеЕсли К = 92 Тогда
|
|
229
|
+
Рез = Рез + "\\";
|
|
230
|
+
ИначеЕсли К = 10 Тогда
|
|
231
|
+
Рез = Рез + "\n";
|
|
232
|
+
ИначеЕсли К = 13 Тогда
|
|
233
|
+
Рез = Рез + "\r";
|
|
234
|
+
ИначеЕсли К = 9 Тогда
|
|
235
|
+
Рез = Рез + "\t";
|
|
236
|
+
Иначе
|
|
237
|
+
Рез = Рез + "\u00" + Сред("0123456789abcdef", (К - К % 16) / 16 + 1, 1) + Сред("0123456789abcdef", К % 16 + 1, 1);
|
|
238
|
+
КонецЕсли;
|
|
239
|
+
Нач = Инд + 1;
|
|
240
|
+
КонецЕсли;
|
|
241
|
+
КонецЦикла;
|
|
242
|
+
Возврат Рез + Сред(С, Нач) + """";
|
|
243
|
+
КонецФункции
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// Раннер BSL-бэкенда (исполнитель OneScript): тот же вход и тот же ответ, что у
|
|
2
|
+
// runner.rb.
|
|
3
|
+
//
|
|
4
|
+
// Протокол выхода общий для всех целей: ответ — JSON и код 0; названный отказ
|
|
5
|
+
// среза — JSON {"refused": текст} и код 3, текст побайтово одинаков между
|
|
6
|
+
// целями; любое другое исключение — крах (OneScript печатает его и выходит с
|
|
7
|
+
// кодом 1), который ворота валят.
|
|
8
|
+
Перем РТ;
|
|
9
|
+
Перем J;
|
|
10
|
+
Перем Модель;
|
|
11
|
+
Перем Замечания;
|
|
12
|
+
|
|
13
|
+
Функция Аргумент(А)
|
|
14
|
+
Вид = J.Поле(А, "kind");
|
|
15
|
+
Если Вид = "entity_ref" Тогда
|
|
16
|
+
Возврат J.Поле(А, "id");
|
|
17
|
+
ИначеЕсли Вид = "const_ref" Тогда
|
|
18
|
+
// §54: разыменование предшествует исполнению; член перечисления §38 либо
|
|
19
|
+
// имя без объявления остаётся идентичностью, как в ключе атома оракула.
|
|
20
|
+
К = Модель.Константа(J.Поле(А, "id"));
|
|
21
|
+
Если К = Неопределено Тогда
|
|
22
|
+
Возврат РТ.op_sym(J.Текст(J.Поле(А, "id")));
|
|
23
|
+
КонецЕсли;
|
|
24
|
+
Возврат К.Значение;
|
|
25
|
+
ИначеЕсли Вид <> "value" Тогда
|
|
26
|
+
РТ.Отказ("аргумент вне среза раннера: " + J.Текст(Вид));
|
|
27
|
+
КонецЕсли;
|
|
28
|
+
ТипЗн = J.Поле(J.Поле(А, "type"), "name");
|
|
29
|
+
Зн = J.Текст(J.Поле(А, "value"));
|
|
30
|
+
Если ТипЗн = "urn:law:std#Money" Тогда
|
|
31
|
+
Возврат РТ.op_money(Зн, J.Поле(А, "currency"));
|
|
32
|
+
ИначеЕсли ТипЗн = "urn:law:std#Decimal" Или ТипЗн = "urn:law:std#Integer" Тогда
|
|
33
|
+
Возврат РТ.op_dec(Зн);
|
|
34
|
+
ИначеЕсли ТипЗн = "urn:law:std#Text" Тогда
|
|
35
|
+
Возврат Зн;
|
|
36
|
+
ИначеЕсли ТипЗн = "urn:law:std#Date" Тогда
|
|
37
|
+
Возврат РТ.op_date(Зн);
|
|
38
|
+
КонецЕсли;
|
|
39
|
+
РТ.Отказ("аргумент вне среза раннера: " + J.Текст(ТипЗн));
|
|
40
|
+
КонецФункции
|
|
41
|
+
|
|
42
|
+
// Тип аргумента, если известен: у value — из узла, у const_ref — из объявления
|
|
43
|
+
// константы; entity_ref типа не несёт (как у оракула).
|
|
44
|
+
Функция ТипАргумента(А)
|
|
45
|
+
Вид = J.Поле(А, "kind");
|
|
46
|
+
Если Вид = "value" Тогда
|
|
47
|
+
Возврат J.Поле(J.Поле(А, "type"), "name");
|
|
48
|
+
ИначеЕсли Вид = "const_ref" Тогда
|
|
49
|
+
К = Модель.Константа(J.Поле(А, "id"));
|
|
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
|
+
Арг = J.Поле(Лит, "args");
|
|
75
|
+
Возврат ?(Арг = Неопределено, Новый Массив, Арг);
|
|
76
|
+
КонецФункции
|
|
77
|
+
|
|
78
|
+
// Арность и типы аргументов против сигнатуры §189 (E-0046). Утверждение дела
|
|
79
|
+
// при несовпадении даёт TYPE_ERROR; запрос — нет: ключ атома у оракула §208
|
|
80
|
+
// включает ТИП значения, несогласованный запрос атома не находит — NEITHER.
|
|
81
|
+
Функция Типизировано(Лит, Замечать)
|
|
82
|
+
Пар = Модель.Параметры(J.Поле(Лит, "predicate"));
|
|
83
|
+
Если Пар = Неопределено Тогда
|
|
84
|
+
Возврат Замечать;
|
|
85
|
+
КонецЕсли;
|
|
86
|
+
Арг = Аргументы(Лит);
|
|
87
|
+
Годно = Арг.Количество() = Пар.Количество();
|
|
88
|
+
Если Годно Тогда
|
|
89
|
+
Для Инд = 0 По Пар.Количество() - 1 Цикл
|
|
90
|
+
Фактический = ТипАргумента(Арг[Инд]);
|
|
91
|
+
Если Фактический <> Неопределено Тогда
|
|
92
|
+
Если Не Подходит(Фактический, Пар[Инд]) Тогда
|
|
93
|
+
Годно = Ложь;
|
|
94
|
+
Прервать;
|
|
95
|
+
КонецЕсли;
|
|
96
|
+
КонецЕсли;
|
|
97
|
+
КонецЦикла;
|
|
98
|
+
КонецЕсли;
|
|
99
|
+
Если Не Годно И Замечать Тогда
|
|
100
|
+
Замечания.Добавить("TYPE_ERROR");
|
|
101
|
+
КонецЕсли;
|
|
102
|
+
Возврат Годно;
|
|
103
|
+
КонецФункции
|
|
104
|
+
|
|
105
|
+
Функция БлокируетКонфликтКлюча(Пред)
|
|
106
|
+
// E-0210/E-0242: только прямое и транзитивное чтение конфликтной таблицы.
|
|
107
|
+
Заражено = Новый Соответствие;
|
|
108
|
+
Очередь = Модель.КонфликтныеПредикатыКлючей();
|
|
109
|
+
Для Каждого Источник Из Очередь Цикл
|
|
110
|
+
Заражено.Вставить(Источник, Истина);
|
|
111
|
+
КонецЦикла;
|
|
112
|
+
Индекс = 0;
|
|
113
|
+
Пока Индекс < Очередь.Количество() Цикл
|
|
114
|
+
Источник = Очередь[Индекс];
|
|
115
|
+
Индекс = Индекс + 1;
|
|
116
|
+
Читатели = Модель.ЧитателиКлюча(Источник);
|
|
117
|
+
Если Читатели = Неопределено Тогда
|
|
118
|
+
Продолжить;
|
|
119
|
+
КонецЕсли;
|
|
120
|
+
Для Каждого Читатель Из Читатели Цикл
|
|
121
|
+
Если Заражено.Получить(Читатель) = Неопределено Тогда
|
|
122
|
+
Заражено.Вставить(Читатель, Истина);
|
|
123
|
+
Очередь.Добавить(Читатель);
|
|
124
|
+
КонецЕсли;
|
|
125
|
+
КонецЦикла;
|
|
126
|
+
КонецЦикла;
|
|
127
|
+
Возврат Заражено.Получить(Пред) <> Неопределено;
|
|
128
|
+
КонецФункции
|
|
129
|
+
|
|
130
|
+
Процедура Главная()
|
|
131
|
+
Дело = J.Прочитать(АргументыКоманднойСтроки[0]);
|
|
132
|
+
Вопрос = J.Прочитать(АргументыКоманднойСтроки[1]);
|
|
133
|
+
РТ.op_setLegalTime(J.Текст(J.Поле(J.Поле(Дело, "context"), "legalTime")));
|
|
134
|
+
Модель.Начать(РТ);
|
|
135
|
+
Для Каждого Утв Из J.Поле(Дело, "assertions") Цикл
|
|
136
|
+
Лит = J.Поле(Утв, "literal");
|
|
137
|
+
Если J.Поле(Лит, "polarity") <> "positive" Тогда
|
|
138
|
+
РТ.Отказ("§113: отрицательный факт вне L0-среза");
|
|
139
|
+
КонецЕсли;
|
|
140
|
+
Пред = J.Поле(Лит, "predicate");
|
|
141
|
+
Если Не Типизировано(Лит, Истина) Или Модель.Параметры(Пред) = Неопределено Тогда
|
|
142
|
+
Продолжить;
|
|
143
|
+
КонецЕсли;
|
|
144
|
+
Ряд = Новый Массив;
|
|
145
|
+
Для Каждого Х Из Аргументы(Лит) Цикл
|
|
146
|
+
Ряд.Добавить(Аргумент(Х));
|
|
147
|
+
КонецЦикла;
|
|
148
|
+
Модель.Зарегистрировать(Пред, Ряд);
|
|
149
|
+
КонецЦикла;
|
|
150
|
+
Модель.Насытить();
|
|
151
|
+
Для Н = 1 По Модель.КонфликтыКлючей() Цикл
|
|
152
|
+
Замечания.Добавить("KEY_CONFLICT");
|
|
153
|
+
КонецЦикла;
|
|
154
|
+
Если J.Поле(Вопрос, "kind") <> "truth" Тогда
|
|
155
|
+
РТ.Отказ("вид запроса вне среза раннера: " + J.Текст(J.Поле(Вопрос, "kind")));
|
|
156
|
+
КонецЕсли;
|
|
157
|
+
Попадание = Ложь;
|
|
158
|
+
ЛитВ = J.Поле(Вопрос, "literal");
|
|
159
|
+
Если Типизировано(ЛитВ, Ложь) Тогда
|
|
160
|
+
Нужно = Новый Массив;
|
|
161
|
+
Для Каждого Х Из Аргументы(ЛитВ) Цикл
|
|
162
|
+
Нужно.Добавить(Аргумент(Х));
|
|
163
|
+
КонецЦикла;
|
|
164
|
+
Для Каждого Р Из Модель.Строки(J.Поле(ЛитВ, "predicate")) Цикл
|
|
165
|
+
Если Р.Количество() <> Нужно.Количество() Тогда
|
|
166
|
+
Продолжить;
|
|
167
|
+
КонецЕсли;
|
|
168
|
+
Все = Истина;
|
|
169
|
+
Для Инд = 0 По Р.Количество() - 1 Цикл
|
|
170
|
+
Если Не РТ.op_eq(Р[Инд], Нужно[Инд]) Тогда
|
|
171
|
+
Все = Ложь;
|
|
172
|
+
Прервать;
|
|
173
|
+
КонецЕсли;
|
|
174
|
+
КонецЦикла;
|
|
175
|
+
Если Все Тогда
|
|
176
|
+
Попадание = Истина;
|
|
177
|
+
Прервать;
|
|
178
|
+
КонецЕсли;
|
|
179
|
+
КонецЦикла;
|
|
180
|
+
КонецЕсли;
|
|
181
|
+
Коды = "";
|
|
182
|
+
Для Каждого Код Из Замечания Цикл
|
|
183
|
+
Коды = ?(Коды = "", "", Коды + ",") + J.ТекстJSON(Код);
|
|
184
|
+
КонецЦикла;
|
|
185
|
+
ИдВопроса = J.Поле(Вопрос, "queryId");
|
|
186
|
+
СтатусИсполнения = ?(БлокируетКонфликтКлюча(J.Поле(ЛитВ, "predicate")), "NON_EXECUTABLE", "COMPUTED");
|
|
187
|
+
// Открытый мир: отсутствие строки — это NEITHER, а не FALSE_ONLY.
|
|
188
|
+
Сообщить("{""queryId"":" + ?(ИдВопроса = Неопределено, "null", J.ТекстJSON(J.Текст(ИдВопроса)))
|
|
189
|
+
+ ",""truthStatus"":" + ?(Попадание, """TRUE_ONLY""", """NEITHER""")
|
|
190
|
+
+ ",""evaluationStatus"":" + J.ТекстJSON(СтатусИсполнения) + ",""issues"":[" + Коды + "]}");
|
|
191
|
+
КонецПроцедуры
|
|
192
|
+
|
|
193
|
+
Каталог = ТекущийСценарий().Каталог;
|
|
194
|
+
ПодключитьСценарий(ОбъединитьПути(Каталог, "json.bsl"), "JsonL0");
|
|
195
|
+
ПодключитьСценарий(ОбъединитьПути(Каталог, "runtime.bsl"), "РантаймL0");
|
|
196
|
+
ПодключитьСценарий(ОбъединитьПути(Каталог, "model.bsl"), "МодельL0");
|
|
197
|
+
J = Новый JsonL0();
|
|
198
|
+
РТ = Новый РантаймL0();
|
|
199
|
+
Модель = Новый МодельL0();
|
|
200
|
+
Замечания = Новый Массив;
|
|
201
|
+
Попытка
|
|
202
|
+
Главная();
|
|
203
|
+
Исключение
|
|
204
|
+
ТекстОтказа = РТ.ТекстОтказа(ИнформацияОбОшибке().Описание);
|
|
205
|
+
Если ТекстОтказа = Неопределено Тогда
|
|
206
|
+
ВызватьИсключение;
|
|
207
|
+
КонецЕсли;
|
|
208
|
+
Сообщить("{""refused"":" + J.ТекстJSON(ТекстОтказа) + "}");
|
|
209
|
+
ЗавершитьРаботу(3);
|
|
210
|
+
КонецПопытки;
|