| 349 | |
| 350 | |
| 351 | def _assert_indexes_invariants_checks( |
| 352 | indexes, possible_coord_variables, dims, check_default=True |
| 353 | ): |
| 354 | assert isinstance(indexes, dict), indexes |
| 355 | assert all(isinstance(v, Index) for v in indexes.values()), { |
| 356 | k: type(v) for k, v in indexes.items() |
| 357 | } |
| 358 | |
| 359 | if check_default: |
| 360 | index_vars = { |
| 361 | k |
| 362 | for k, v in possible_coord_variables.items() |
| 363 | if isinstance(v, IndexVariable) |
| 364 | } |
| 365 | assert indexes.keys() <= index_vars, (set(indexes), index_vars) |
| 366 | assert all( |
| 367 | k in index_vars |
| 368 | for k, v in possible_coord_variables.items() |
| 369 | if v.dims == (k,) |
| 370 | ), {k: type(v) for k, v in possible_coord_variables.items()} |
| 371 | |
| 372 | assert not any( |
| 373 | isinstance(v, IndexVariable) |
| 374 | for k, v in possible_coord_variables.items() |
| 375 | if k not in indexes.keys() |
| 376 | ), {k: type(v) for k, v in possible_coord_variables.items()} |
| 377 | |
| 378 | # check pandas index wrappers vs. coordinate data adapters |
| 379 | for k, index in indexes.items(): |
| 380 | if isinstance(index, PandasIndex): |
| 381 | pd_index = index.index |
| 382 | var = possible_coord_variables[k] |
| 383 | assert (index.dim,) == var.dims, (pd_index, var) |
| 384 | if k == index.dim: |
| 385 | # skip multi-index levels here (checked below) |
| 386 | assert index.coord_dtype == var.dtype, (index.coord_dtype, var.dtype) |
| 387 | assert isinstance(var._data.array, pd.Index), var._data.array |
| 388 | # TODO: check identity instead of equality? |
| 389 | assert pd_index.equals(var._data.array), (pd_index, var) |
| 390 | if isinstance(index, PandasMultiIndex): |
| 391 | pd_index = index.index |
| 392 | for name in index.index.names: |
| 393 | assert name in possible_coord_variables, (pd_index, index_vars) |
| 394 | var = possible_coord_variables[name] |
| 395 | assert (index.dim,) == var.dims, (pd_index, var) |
| 396 | assert index.level_coords_dtype[name] == var.dtype, ( |
| 397 | index.level_coords_dtype[name], |
| 398 | var.dtype, |
| 399 | ) |
| 400 | assert isinstance(var._data.array, pd.MultiIndex), var._data.array |
| 401 | assert pd_index.equals(var._data.array), (pd_index, var) |
| 402 | # check all all levels are in `indexes` |
| 403 | assert name in indexes, (name, set(indexes)) |
| 404 | # index identity is used to find unique indexes in `indexes` |
| 405 | assert index is indexes[name], (pd_index, indexes[name].index) |
| 406 | |
| 407 | if check_default: |
| 408 | defaults = default_indexes(possible_coord_variables, dims) |