robotcode-robot 0.74.0__py3-none-any.whl → 0.76.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.
@@ -684,10 +684,17 @@ class Namespace:
684
684
 
685
685
  def _invalidate(self) -> None:
686
686
  self._invalid = True
687
+ self.imports_manager.imports_changed.remove(self.imports_changed)
688
+ self.imports_manager.libraries_changed.remove(self.libraries_changed)
689
+ self.imports_manager.resources_changed.remove(self.resources_changed)
690
+ self.imports_manager.variables_changed.remove(self.variables_changed)
687
691
 
688
692
  @_logger.call
689
693
  def invalidate(self) -> None:
690
694
  with self._initialize_lock:
695
+ if self._invalid:
696
+ return
697
+
691
698
  self._invalidate()
692
699
  self.has_invalidated(self)
693
700
 
@@ -981,215 +988,228 @@ class Namespace:
981
988
 
982
989
  return None
983
990
 
984
- def _import_imports(
991
+ def _import(
985
992
  self,
986
- imports: Iterable[Import],
993
+ value: Import,
994
+ variables: Optional[Dict[str, Any]],
987
995
  base_dir: str,
988
996
  *,
989
997
  top_level: bool = False,
990
- variables: Optional[Dict[str, Any]] = None,
991
998
  source: Optional[str] = None,
992
999
  parent_import: Optional[Import] = None,
993
- ) -> None:
994
- def _import(
995
- value: Import, variables: Optional[Dict[str, Any]] = None
996
- ) -> Tuple[Optional[LibraryEntry], Optional[Dict[str, Any]]]:
997
- result: Optional[LibraryEntry] = None
998
- try:
999
- if isinstance(value, LibraryImport):
1000
- if value.name is None:
1001
- raise NameSpaceError("Library setting requires value.")
1000
+ ) -> Optional[LibraryEntry]:
1001
+ result: Optional[LibraryEntry] = None
1002
+ try:
1003
+ if isinstance(value, LibraryImport):
1004
+ if value.name is None:
1005
+ raise NameSpaceError("Library setting requires value.")
1006
+
1007
+ result = self._get_library_entry(
1008
+ value.name,
1009
+ value.args,
1010
+ value.alias,
1011
+ base_dir,
1012
+ sentinel=self,
1013
+ variables=variables,
1014
+ )
1015
+ result.import_range = value.range
1016
+ result.import_source = value.source
1017
+ result.alias_range = value.alias_range
1002
1018
 
1003
- result = self._get_library_entry(
1019
+ self._import_entries[value] = result
1020
+
1021
+ if (
1022
+ top_level
1023
+ and result.library_doc.errors is None
1024
+ and (len(result.library_doc.keywords) == 0 and not bool(result.library_doc.has_listener))
1025
+ ):
1026
+ self.append_diagnostics(
1027
+ range=value.range,
1028
+ message=f"Imported library '{value.name}' contains no keywords.",
1029
+ severity=DiagnosticSeverity.WARNING,
1030
+ source=DIAGNOSTICS_SOURCE_NAME,
1031
+ code=Error.LIBRARY_CONTAINS_NO_KEYWORDS,
1032
+ )
1033
+ elif isinstance(value, ResourceImport):
1034
+ if value.name is None:
1035
+ raise NameSpaceError("Resource setting requires value.")
1036
+
1037
+ source = self.imports_manager.find_resource(value.name, base_dir, variables=variables)
1038
+
1039
+ if self.source == source:
1040
+ if parent_import:
1041
+ self.append_diagnostics(
1042
+ range=parent_import.range,
1043
+ message="Possible circular import.",
1044
+ severity=DiagnosticSeverity.INFORMATION,
1045
+ source=DIAGNOSTICS_SOURCE_NAME,
1046
+ related_information=(
1047
+ [
1048
+ DiagnosticRelatedInformation(
1049
+ location=Location(
1050
+ str(Uri.from_path(value.source)),
1051
+ value.range,
1052
+ ),
1053
+ message=f"'{Path(self.source).name}' is also imported here.",
1054
+ )
1055
+ ]
1056
+ if value.source
1057
+ else None
1058
+ ),
1059
+ code=Error.POSSIBLE_CIRCULAR_IMPORT,
1060
+ )
1061
+ else:
1062
+ result = self._get_resource_entry(
1004
1063
  value.name,
1005
- value.args,
1006
- value.alias,
1007
1064
  base_dir,
1008
- sentinel=self,
1009
1065
  variables=variables,
1010
1066
  )
1011
1067
  result.import_range = value.range
1012
1068
  result.import_source = value.source
1013
- result.alias_range = value.alias_range
1014
1069
 
1015
1070
  self._import_entries[value] = result
1016
1071
 
1017
- if (
1018
- top_level
1019
- and result.library_doc.errors is None
1020
- and (len(result.library_doc.keywords) == 0 and not bool(result.library_doc.has_listener))
1072
+ if top_level and (
1073
+ not result.library_doc.errors
1074
+ and top_level
1075
+ and not result.imports
1076
+ and not result.variables
1077
+ and not result.library_doc.keywords
1021
1078
  ):
1022
1079
  self.append_diagnostics(
1023
1080
  range=value.range,
1024
- message=f"Imported library '{value.name}' contains no keywords.",
1081
+ message=f"Imported resource file '{value.name}' is empty.",
1025
1082
  severity=DiagnosticSeverity.WARNING,
1026
1083
  source=DIAGNOSTICS_SOURCE_NAME,
1027
- code=Error.LIBRARY_CONTAINS_NO_KEYWORDS,
1028
- )
1029
- elif isinstance(value, ResourceImport):
1030
- if value.name is None:
1031
- raise NameSpaceError("Resource setting requires value.")
1032
-
1033
- source = self.imports_manager.find_resource(value.name, base_dir, variables=variables)
1034
-
1035
- if self.source == source:
1036
- if parent_import:
1037
- self.append_diagnostics(
1038
- range=parent_import.range,
1039
- message="Possible circular import.",
1040
- severity=DiagnosticSeverity.INFORMATION,
1041
- source=DIAGNOSTICS_SOURCE_NAME,
1042
- related_information=(
1043
- [
1044
- DiagnosticRelatedInformation(
1045
- location=Location(
1046
- str(Uri.from_path(value.source)),
1047
- value.range,
1048
- ),
1049
- message=f"'{Path(self.source).name}' is also imported here.",
1050
- )
1051
- ]
1052
- if value.source
1053
- else None
1054
- ),
1055
- code=Error.POSSIBLE_CIRCULAR_IMPORT,
1056
- )
1057
- else:
1058
- result = self._get_resource_entry(
1059
- value.name,
1060
- base_dir,
1061
- variables=variables,
1084
+ code=Error.RESOURCE_EMPTY,
1062
1085
  )
1063
- result.import_range = value.range
1064
- result.import_source = value.source
1065
-
1066
- self._import_entries[value] = result
1067
- if result.variables:
1068
- variables = None
1069
-
1070
- if top_level and (
1071
- not result.library_doc.errors
1072
- and top_level
1073
- and not result.imports
1074
- and not result.variables
1075
- and not result.library_doc.keywords
1076
- ):
1077
- self.append_diagnostics(
1078
- range=value.range,
1079
- message=f"Imported resource file '{value.name}' is empty.",
1080
- severity=DiagnosticSeverity.WARNING,
1081
- source=DIAGNOSTICS_SOURCE_NAME,
1082
- code=Error.RESOURCE_EMPTY,
1083
- )
1084
1086
 
1085
- elif isinstance(value, VariablesImport):
1086
- if value.name is None:
1087
- raise NameSpaceError("Variables setting requires value.")
1087
+ elif isinstance(value, VariablesImport):
1088
+ if value.name is None:
1089
+ raise NameSpaceError("Variables setting requires value.")
1088
1090
 
1089
- result = self._get_variables_entry(
1090
- value.name,
1091
- value.args,
1092
- base_dir,
1093
- variables=variables,
1094
- )
1091
+ result = self._get_variables_entry(
1092
+ value.name,
1093
+ value.args,
1094
+ base_dir,
1095
+ variables=variables,
1096
+ )
1095
1097
 
1096
- result.import_range = value.range
1097
- result.import_source = value.source
1098
+ result.import_range = value.range
1099
+ result.import_source = value.source
1098
1100
 
1099
- self._import_entries[value] = result
1100
- variables = None
1101
- else:
1102
- raise DiagnosticsError("Unknown import type.")
1101
+ self._import_entries[value] = result
1102
+ else:
1103
+ raise DiagnosticsError("Unknown import type.")
1103
1104
 
1104
- if top_level and result is not None:
1105
- if result.library_doc.source is not None and result.library_doc.errors:
1106
- if any(err.source and Path(err.source).is_absolute() for err in result.library_doc.errors):
1107
- self.append_diagnostics(
1108
- range=value.range,
1109
- message="Import definition contains errors.",
1110
- severity=DiagnosticSeverity.ERROR,
1111
- source=DIAGNOSTICS_SOURCE_NAME,
1112
- related_information=[
1113
- DiagnosticRelatedInformation(
1114
- location=Location(
1115
- uri=str(Uri.from_path(err.source)),
1116
- range=Range(
1117
- start=Position(
1118
- line=(
1119
- err.line_no - 1
1120
- if err.line_no is not None
1121
- else max(
1122
- result.library_doc.line_no,
1123
- 0,
1124
- )
1125
- ),
1126
- character=0,
1105
+ if top_level and result is not None:
1106
+ if result.library_doc.source is not None and result.library_doc.errors:
1107
+ if any(err.source and Path(err.source).is_absolute() for err in result.library_doc.errors):
1108
+ self.append_diagnostics(
1109
+ range=value.range,
1110
+ message="Import definition contains errors.",
1111
+ severity=DiagnosticSeverity.ERROR,
1112
+ source=DIAGNOSTICS_SOURCE_NAME,
1113
+ related_information=[
1114
+ DiagnosticRelatedInformation(
1115
+ location=Location(
1116
+ uri=str(Uri.from_path(err.source)),
1117
+ range=Range(
1118
+ start=Position(
1119
+ line=(
1120
+ err.line_no - 1
1121
+ if err.line_no is not None
1122
+ else max(
1123
+ result.library_doc.line_no,
1124
+ 0,
1125
+ )
1127
1126
  ),
1128
- end=Position(
1129
- line=(
1130
- err.line_no - 1
1131
- if err.line_no is not None
1132
- else max(
1133
- result.library_doc.line_no,
1134
- 0,
1135
- )
1136
- ),
1137
- character=0,
1127
+ character=0,
1128
+ ),
1129
+ end=Position(
1130
+ line=(
1131
+ err.line_no - 1
1132
+ if err.line_no is not None
1133
+ else max(
1134
+ result.library_doc.line_no,
1135
+ 0,
1136
+ )
1138
1137
  ),
1138
+ character=0,
1139
1139
  ),
1140
1140
  ),
1141
- message=err.message,
1142
- )
1143
- for err in result.library_doc.errors
1144
- if err.source is not None
1145
- ],
1146
- code=Error.IMPORT_CONTAINS_ERRORS,
1147
- )
1148
- for err in filter(
1149
- lambda e: e.source is None or not Path(e.source).is_absolute(),
1150
- result.library_doc.errors,
1151
- ):
1152
- self.append_diagnostics(
1153
- range=value.range,
1154
- message=err.message,
1155
- severity=DiagnosticSeverity.ERROR,
1156
- source=DIAGNOSTICS_SOURCE_NAME,
1157
- code=err.type_name,
1158
- )
1159
- elif result.library_doc.errors is not None:
1160
- for err in result.library_doc.errors:
1161
- self.append_diagnostics(
1162
- range=value.range,
1163
- message=err.message,
1164
- severity=DiagnosticSeverity.ERROR,
1165
- source=DIAGNOSTICS_SOURCE_NAME,
1166
- code=err.type_name,
1167
- )
1141
+ ),
1142
+ message=err.message,
1143
+ )
1144
+ for err in result.library_doc.errors
1145
+ if err.source is not None
1146
+ ],
1147
+ code=Error.IMPORT_CONTAINS_ERRORS,
1148
+ )
1149
+ for err in filter(
1150
+ lambda e: e.source is None or not Path(e.source).is_absolute(),
1151
+ result.library_doc.errors,
1152
+ ):
1153
+ self.append_diagnostics(
1154
+ range=value.range,
1155
+ message=err.message,
1156
+ severity=DiagnosticSeverity.ERROR,
1157
+ source=DIAGNOSTICS_SOURCE_NAME,
1158
+ code=err.type_name,
1159
+ )
1160
+ elif result.library_doc.errors is not None:
1161
+ for err in result.library_doc.errors:
1162
+ self.append_diagnostics(
1163
+ range=value.range,
1164
+ message=err.message,
1165
+ severity=DiagnosticSeverity.ERROR,
1166
+ source=DIAGNOSTICS_SOURCE_NAME,
1167
+ code=err.type_name,
1168
+ )
1168
1169
 
1169
- except (SystemExit, KeyboardInterrupt):
1170
- raise
1171
- except BaseException as e:
1172
- if top_level:
1173
- self.append_diagnostics(
1174
- range=value.range,
1175
- message=str(e),
1176
- severity=DiagnosticSeverity.ERROR,
1177
- source=DIAGNOSTICS_SOURCE_NAME,
1178
- code=type(e).__qualname__,
1179
- )
1180
- finally:
1181
- self._reset_global_variables()
1170
+ except (SystemExit, KeyboardInterrupt):
1171
+ raise
1172
+ except BaseException as e:
1173
+ if top_level:
1174
+ self.append_diagnostics(
1175
+ range=value.range,
1176
+ message=str(e),
1177
+ severity=DiagnosticSeverity.ERROR,
1178
+ source=DIAGNOSTICS_SOURCE_NAME,
1179
+ code=type(e).__qualname__,
1180
+ )
1181
+ finally:
1182
+ self._reset_global_variables()
1183
+
1184
+ return result
1182
1185
 
1183
- return result, variables
1186
+ def _import_imports(
1187
+ self,
1188
+ imports: Iterable[Import],
1189
+ base_dir: str,
1190
+ *,
1191
+ top_level: bool = False,
1192
+ variables: Optional[Dict[str, Any]] = None,
1193
+ source: Optional[str] = None,
1194
+ parent_import: Optional[Import] = None,
1195
+ depth: int = 0,
1196
+ ) -> Optional[Dict[str, Any]]:
1184
1197
 
1185
1198
  current_time = time.monotonic()
1186
- self._logger.debug(lambda: f"start imports for {self.document if top_level else source}")
1199
+ self._logger.debug(lambda: f"{' '*depth}start imports for {self.document if top_level else source}")
1187
1200
  try:
1188
1201
  for imp in imports:
1189
1202
  if variables is None:
1190
1203
  variables = self.get_resolvable_variables()
1191
1204
 
1192
- entry, variables = _import(imp, variables=variables)
1205
+ entry = self._import(
1206
+ imp,
1207
+ variables=variables,
1208
+ base_dir=base_dir,
1209
+ top_level=top_level,
1210
+ source=source,
1211
+ parent_import=parent_import,
1212
+ )
1193
1213
 
1194
1214
  if entry is not None:
1195
1215
  if isinstance(entry, ResourceEntry):
@@ -1201,14 +1221,18 @@ class Namespace:
1201
1221
 
1202
1222
  if already_imported_resources is None and entry.library_doc.source != self.source:
1203
1223
  self._resources[entry.import_name] = entry
1224
+ if entry.variables:
1225
+ variables = self.get_resolvable_variables()
1226
+
1204
1227
  try:
1205
- self._import_imports(
1228
+ variables = self._import_imports(
1206
1229
  entry.imports,
1207
1230
  str(Path(entry.library_doc.source).parent),
1208
1231
  top_level=False,
1209
1232
  variables=variables,
1210
1233
  source=entry.library_doc.source,
1211
1234
  parent_import=imp if top_level else parent_import,
1235
+ depth=depth + 1,
1212
1236
  )
1213
1237
  except (SystemExit, KeyboardInterrupt):
1214
1238
  raise
@@ -1221,56 +1245,59 @@ class Namespace:
1221
1245
  source=DIAGNOSTICS_SOURCE_NAME,
1222
1246
  code=type(e).__qualname__,
1223
1247
  )
1224
- else:
1225
- if top_level:
1226
- if entry.library_doc.source == self.source:
1227
- self.append_diagnostics(
1228
- range=entry.import_range,
1229
- message="Recursive resource import.",
1230
- severity=DiagnosticSeverity.INFORMATION,
1231
- source=DIAGNOSTICS_SOURCE_NAME,
1232
- code=Error.RECURSIVE_IMPORT,
1233
- )
1234
- elif (
1235
- already_imported_resources is not None
1236
- and already_imported_resources.library_doc.source
1237
- ):
1238
- self.append_diagnostics(
1239
- range=entry.import_range,
1240
- message=f"Resource {entry} already imported.",
1241
- severity=DiagnosticSeverity.INFORMATION,
1242
- source=DIAGNOSTICS_SOURCE_NAME,
1243
- related_information=(
1244
- [
1245
- DiagnosticRelatedInformation(
1246
- location=Location(
1247
- uri=str(
1248
- Uri.from_path(already_imported_resources.import_source)
1249
- ),
1250
- range=already_imported_resources.import_range,
1251
- ),
1252
- message="",
1253
- )
1254
- ]
1255
- if already_imported_resources.import_source
1256
- else None
1257
- ),
1258
- code=Error.RESOURCE_ALREADY_IMPORTED,
1259
- )
1248
+ elif top_level:
1249
+ if entry.library_doc.source == self.source:
1250
+ self.append_diagnostics(
1251
+ range=entry.import_range,
1252
+ message="Recursive resource import.",
1253
+ severity=DiagnosticSeverity.INFORMATION,
1254
+ source=DIAGNOSTICS_SOURCE_NAME,
1255
+ code=Error.RECURSIVE_IMPORT,
1256
+ )
1257
+ elif (
1258
+ already_imported_resources is not None and already_imported_resources.library_doc.source
1259
+ ):
1260
+ self.append_diagnostics(
1261
+ range=entry.import_range,
1262
+ message=f"Resource {entry} already imported.",
1263
+ severity=DiagnosticSeverity.INFORMATION,
1264
+ source=DIAGNOSTICS_SOURCE_NAME,
1265
+ related_information=(
1266
+ [
1267
+ DiagnosticRelatedInformation(
1268
+ location=Location(
1269
+ uri=str(Uri.from_path(already_imported_resources.import_source)),
1270
+ range=already_imported_resources.import_range,
1271
+ ),
1272
+ message="",
1273
+ )
1274
+ ]
1275
+ if already_imported_resources.import_source
1276
+ else None
1277
+ ),
1278
+ code=Error.RESOURCE_ALREADY_IMPORTED,
1279
+ )
1260
1280
 
1261
1281
  elif isinstance(entry, VariablesEntry):
1262
- already_imported_variables = [
1263
- e
1264
- for e in self._variables.values()
1265
- if e.library_doc.source == entry.library_doc.source
1266
- and e.alias == entry.alias
1267
- and e.args == entry.args
1268
- ]
1282
+ already_imported_variables = next(
1283
+ (
1284
+ e
1285
+ for e in self._variables.values()
1286
+ if e.library_doc.source == entry.library_doc.source
1287
+ and e.alias == entry.alias
1288
+ and e.args == entry.args
1289
+ ),
1290
+ None,
1291
+ )
1269
1292
  if (
1270
- top_level
1271
- and already_imported_variables
1272
- and already_imported_variables[0].library_doc.source
1293
+ already_imported_variables is None
1294
+ and entry.library_doc is not None
1295
+ and entry.library_doc.source_or_origin
1273
1296
  ):
1297
+ self._variables[entry.library_doc.source_or_origin] = entry
1298
+ if entry.variables:
1299
+ variables = self.get_resolvable_variables()
1300
+ elif top_level and already_imported_variables and already_imported_variables.library_doc.source:
1274
1301
  self.append_diagnostics(
1275
1302
  range=entry.import_range,
1276
1303
  message=f'Variables "{entry}" already imported.',
@@ -1280,21 +1307,18 @@ class Namespace:
1280
1307
  [
1281
1308
  DiagnosticRelatedInformation(
1282
1309
  location=Location(
1283
- uri=str(Uri.from_path(already_imported_variables[0].import_source)),
1284
- range=already_imported_variables[0].import_range,
1310
+ uri=str(Uri.from_path(already_imported_variables.import_source)),
1311
+ range=already_imported_variables.import_range,
1285
1312
  ),
1286
1313
  message="",
1287
1314
  )
1288
1315
  ]
1289
- if already_imported_variables[0].import_source
1316
+ if already_imported_variables.import_source
1290
1317
  else None
1291
1318
  ),
1292
1319
  code=Error.VARIABLES_ALREADY_IMPORTED,
1293
1320
  )
1294
1321
 
1295
- if entry.library_doc is not None and entry.library_doc.source_or_origin:
1296
- self._variables[entry.library_doc.source_or_origin] = entry
1297
-
1298
1322
  elif isinstance(entry, LibraryEntry):
1299
1323
  if top_level and entry.name == BUILTIN_LIBRARY_NAME and entry.alias is None:
1300
1324
  self.append_diagnostics(
@@ -1320,15 +1344,23 @@ class Namespace:
1320
1344
  )
1321
1345
  continue
1322
1346
 
1323
- already_imported_library = [
1324
- e
1325
- for e in self._libraries.values()
1326
- if e.library_doc.source == entry.library_doc.source
1327
- and e.library_doc.member_name == entry.library_doc.member_name
1328
- and e.alias == entry.alias
1329
- and e.args == entry.args
1330
- ]
1331
- if top_level and already_imported_library and already_imported_library[0].library_doc.source:
1347
+ already_imported_library = next(
1348
+ (
1349
+ e
1350
+ for e in self._libraries.values()
1351
+ if e.library_doc.source == entry.library_doc.source
1352
+ and e.library_doc.member_name == entry.library_doc.member_name
1353
+ and e.alias == entry.alias
1354
+ and e.args == entry.args
1355
+ ),
1356
+ None,
1357
+ )
1358
+ if (
1359
+ already_imported_library is None
1360
+ and (entry.alias or entry.name or entry.import_name) not in self._libraries
1361
+ ):
1362
+ self._libraries[entry.alias or entry.name or entry.import_name] = entry
1363
+ elif top_level and already_imported_library and already_imported_library.library_doc.source:
1332
1364
  self.append_diagnostics(
1333
1365
  range=entry.import_range,
1334
1366
  message=f'Library "{entry}" already imported.',
@@ -1338,26 +1370,26 @@ class Namespace:
1338
1370
  [
1339
1371
  DiagnosticRelatedInformation(
1340
1372
  location=Location(
1341
- uri=str(Uri.from_path(already_imported_library[0].import_source)),
1342
- range=already_imported_library[0].import_range,
1373
+ uri=str(Uri.from_path(already_imported_library.import_source)),
1374
+ range=already_imported_library.import_range,
1343
1375
  ),
1344
1376
  message="",
1345
1377
  )
1346
1378
  ]
1347
- if already_imported_library[0].import_source
1379
+ if already_imported_library.import_source
1348
1380
  else None
1349
1381
  ),
1350
1382
  code=Error.LIBRARY_ALREADY_IMPORTED,
1351
1383
  )
1352
1384
 
1353
- if (entry.alias or entry.name or entry.import_name) not in self._libraries:
1354
- self._libraries[entry.alias or entry.name or entry.import_name] = entry
1355
1385
  finally:
1356
1386
  self._logger.debug(
1357
- lambda: "end import imports for "
1387
+ lambda: f"{' '*depth}end imports for "
1358
1388
  f"{self.document if top_level else source} in {time.monotonic() - current_time}s"
1359
1389
  )
1360
1390
 
1391
+ return variables
1392
+
1361
1393
  def _import_default_libraries(self, variables: Optional[Dict[str, Any]] = None) -> None:
1362
1394
  def _import_lib(library: str, variables: Optional[Dict[str, Any]] = None) -> Optional[LibraryEntry]:
1363
1395
  try:
@@ -1383,8 +1415,11 @@ class Namespace:
1383
1415
 
1384
1416
  self._logger.debug(lambda: f"start import default libraries for document {self.document}")
1385
1417
  try:
1418
+ if variables is None:
1419
+ variables = self.get_resolvable_variables()
1420
+
1386
1421
  for library in DEFAULT_LIBRARIES:
1387
- e = _import_lib(library, variables or self.get_resolvable_variables())
1422
+ e = _import_lib(library, variables)
1388
1423
  if e is not None:
1389
1424
  self._libraries[e.alias or e.name or e.import_name] = e
1390
1425
  finally:
@@ -1402,12 +1437,15 @@ class Namespace:
1402
1437
  sentinel: Any = None,
1403
1438
  variables: Optional[Dict[str, Any]] = None,
1404
1439
  ) -> LibraryEntry:
1440
+ if variables is None:
1441
+ variables = self.get_resolvable_variables()
1442
+
1405
1443
  library_doc = self.imports_manager.get_libdoc_for_library_import(
1406
1444
  name,
1407
1445
  args,
1408
1446
  base_dir=base_dir,
1409
1447
  sentinel=None if is_default_library else sentinel,
1410
- variables=variables or self.get_resolvable_variables(),
1448
+ variables=variables,
1411
1449
  )
1412
1450
 
1413
1451
  return LibraryEntry(
@@ -1441,14 +1479,11 @@ class Namespace:
1441
1479
  *,
1442
1480
  variables: Optional[Dict[str, Any]] = None,
1443
1481
  ) -> ResourceEntry:
1444
- (
1445
- namespace,
1446
- library_doc,
1447
- ) = self.imports_manager.get_namespace_and_libdoc_for_resource_import(
1448
- name,
1449
- base_dir,
1450
- sentinel=self,
1451
- variables=variables or self.get_resolvable_variables(),
1482
+ if variables is None:
1483
+ variables = self.get_resolvable_variables()
1484
+
1485
+ (namespace, library_doc) = self.imports_manager.get_namespace_and_libdoc_for_resource_import(
1486
+ name, base_dir, sentinel=self, variables=variables
1452
1487
  )
1453
1488
 
1454
1489
  return ResourceEntry(
@@ -1481,12 +1516,15 @@ class Namespace:
1481
1516
  *,
1482
1517
  variables: Optional[Dict[str, Any]] = None,
1483
1518
  ) -> VariablesEntry:
1519
+ if variables is None:
1520
+ variables = self.get_resolvable_variables()
1521
+
1484
1522
  library_doc = self.imports_manager.get_libdoc_for_variables_import(
1485
1523
  name,
1486
1524
  args,
1487
1525
  base_dir=base_dir,
1488
1526
  sentinel=self,
1489
- variables=variables or self.get_resolvable_variables(),
1527
+ variables=variables,
1490
1528
  )
1491
1529
 
1492
1530
  return VariablesEntry(
@@ -1602,6 +1640,8 @@ class Namespace:
1602
1640
  if not self._analyzed:
1603
1641
  canceled = False
1604
1642
 
1643
+ self.ensure_initialized()
1644
+
1605
1645
  self._logger.debug(lambda: f"start analyze {self.document}")
1606
1646
  start_time = time.monotonic()
1607
1647