access-config-utils 0.2__tar.gz → 0.4__tar.gz
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.
- {access_config_utils-0.2 → access_config_utils-0.4}/PKG-INFO +1 -1
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/config_dict.py +13 -10
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/config_store.py +9 -3
- access_config_utils-0.4/src/access/config/parallel_allocation_strategies.py +1397 -0
- access_config_utils-0.4/src/access/config/parallel_component.py +666 -0
- access_config_utils-0.4/src/access/config/parallel_constraints.py +453 -0
- access_config_utils-0.4/src/access/config/parallel_domain.py +113 -0
- access_config_utils-0.4/src/access/config/parallel_layouts.py +446 -0
- access_config_utils-0.4/src/access/config/parallel_mpi_grid.py +125 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/tree_navigation.py +7 -3
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access_config_utils.egg-info/PKG-INFO +1 -1
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access_config_utils.egg-info/SOURCES.txt +13 -4
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_config_dict.py +8 -4
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_config_insert.py +62 -44
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_config_store.py +13 -12
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_entry_render.py +23 -10
- access_config_utils-0.4/tests/test_parallel_allocation_strategies.py +733 -0
- access_config_utils-0.4/tests/test_parallel_component.py +402 -0
- access_config_utils-0.4/tests/test_parallel_constraints.py +380 -0
- access_config_utils-0.4/tests/test_parallel_doctests.py +40 -0
- access_config_utils-0.4/tests/test_parallel_domain.py +94 -0
- access_config_utils-0.4/tests/test_parallel_layouts.py +1174 -0
- access_config_utils-0.4/tests/test_parallel_mpi_grid.py +168 -0
- access_config_utils-0.2/src/access/config/esm1p6_layout_input.py +0 -585
- access_config_utils-0.2/src/access/config/layout_config.py +0 -121
- access_config_utils-0.2/tests/test_esm1p6_layout_input.py +0 -421
- access_config_utils-0.2/tests/test_layout_config.py +0 -126
- {access_config_utils-0.2 → access_config_utils-0.4}/.github/workflows/cd.yml +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/.github/workflows/ci.yml +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/.gitignore +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/.pre-commit-config.yaml +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/.zenodo.json +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/COPYRIGHT.txt +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/LICENSE +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/README.md +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/conda/environment.yml +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/conda/meta.yaml +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/pyproject.toml +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/scripts/run_f90nml_tests.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/setup.cfg +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/setup.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/__init__.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/config.lark +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/config_insert.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/entry_fragments.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/entry_generate.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/entry_render.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/entry_style.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/fortran_nml.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/grammar_compiled.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/grammar_contract.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/grammar_info.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/grammar_values.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/mom6_input.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/nuopc_config.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/parser.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/tree_edits.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/tree_reader.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access/config/yaml_config.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access_config_utils.egg-info/dependency_links.txt +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access_config_utils.egg-info/requires.txt +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/src/access_config_utils.egg-info/top_level.txt +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/conftest.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_entry_fragments.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_entry_generate.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_entry_style.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_fortran_nml.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_grammar_compiled.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_grammar_contract.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_grammar_info.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_grammar_values.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_mom6_input.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_nuopc_config.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_parser.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_tree_edits.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_tree_navigation.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_tree_reader.py +0 -0
- {access_config_utils-0.2 → access_config_utils-0.4}/tests/test_yaml_config.py +0 -0
|
@@ -57,16 +57,17 @@ class ConfigList(list):
|
|
|
57
57
|
|
|
58
58
|
Args:
|
|
59
59
|
data (list[Any]): The list data.
|
|
60
|
-
nodes (Sequence[Tree]): The node backing each element
|
|
60
|
+
nodes (Sequence[Tree | None]): The node backing each element, or ``None`` where an
|
|
61
|
+
array position no entry wrote has none. A repeat node appears once
|
|
61
62
|
per element it covers, so this is one entry per element, not per node.
|
|
62
63
|
ctx (ParseContext): The compiled grammar, needed to parse the replacement for a
|
|
63
64
|
repeat run that an assignment has split.
|
|
64
65
|
"""
|
|
65
66
|
|
|
66
|
-
_nodes: list[Tree] # The
|
|
67
|
+
_nodes: list[Tree | None] # The node backing each element, None where the file wrote nothing.
|
|
67
68
|
_ctx: ParseContext # Compiled grammar and per-parser settings.
|
|
68
69
|
|
|
69
|
-
def __init__(self, data: list[Any], nodes: Sequence[Tree], ctx: ParseContext) -> None:
|
|
70
|
+
def __init__(self, data: list[Any], nodes: Sequence[Tree | None], ctx: ParseContext) -> None:
|
|
70
71
|
super().__init__(data)
|
|
71
72
|
self._nodes = list(nodes)
|
|
72
73
|
self._ctx = ctx
|
|
@@ -89,13 +90,17 @@ class ConfigList(list):
|
|
|
89
90
|
ValueError: If a slice assignment would change the list length.
|
|
90
91
|
"""
|
|
91
92
|
updated = list(self)
|
|
93
|
+
# Held for the super() call below rather than reusing *value*: for a slice that may
|
|
94
|
+
# have been a one-shot iterable, already drained here, and taking it a second time
|
|
95
|
+
# would leave the list short.
|
|
96
|
+
assigned: Any = value
|
|
92
97
|
if isinstance(index, slice):
|
|
93
|
-
|
|
94
|
-
if len(
|
|
98
|
+
assigned = list(value)
|
|
99
|
+
if len(assigned) != len(self._nodes[index]):
|
|
95
100
|
raise ValueError(
|
|
96
|
-
f"Slice assignment would change list length from {len(self._nodes[index])} to {len(
|
|
101
|
+
f"Slice assignment would change list length from {len(self._nodes[index])} to {len(assigned)}"
|
|
97
102
|
)
|
|
98
|
-
updated[index] =
|
|
103
|
+
updated[index] = assigned
|
|
99
104
|
else:
|
|
100
105
|
updated[index] = value
|
|
101
106
|
|
|
@@ -103,9 +108,7 @@ class ConfigList(list):
|
|
|
103
108
|
# several of them at once, so the run it covers is rewritten as a unit. Writing a
|
|
104
109
|
# value back over itself reproduces its own token, so untouched ones do not move.
|
|
105
110
|
self._nodes[:] = write_values(self._nodes, updated, self._ctx.lark)
|
|
106
|
-
|
|
107
|
-
# above, and taking it a second time would leave the list short.
|
|
108
|
-
super().__setitem__(index, values if isinstance(index, slice) else value)
|
|
111
|
+
super().__setitem__(index, assigned)
|
|
109
112
|
|
|
110
113
|
def _unsupported(self, *args: Any, **kwargs: Any) -> NoReturn:
|
|
111
114
|
"""Reject a list operation the parse tree cannot follow.
|
|
@@ -76,7 +76,7 @@ class ConfigStore:
|
|
|
76
76
|
"""
|
|
77
77
|
return ConfigStore(ref.block_nodes[index], self.ctx, addable=ref.addable)
|
|
78
78
|
|
|
79
|
-
def replace(self, key: str, value: Any) -> tuple[Tree, ...]:
|
|
79
|
+
def replace(self, key: str, value: Any) -> tuple[Tree | None, ...]:
|
|
80
80
|
"""Write a new value into the nodes of an entry that already exists.
|
|
81
81
|
|
|
82
82
|
Args:
|
|
@@ -84,7 +84,9 @@ class ConfigStore:
|
|
|
84
84
|
value (Any): The new value: a scalar, or a whole list of the same length.
|
|
85
85
|
|
|
86
86
|
Returns:
|
|
87
|
-
tuple[Tree, ...]: The value-type rule nodes now holding the value.
|
|
87
|
+
tuple[Tree | None, ...]: The value-type rule nodes now holding the value.
|
|
88
|
+
``None`` where an array position no entry wrote has no node to hold one,
|
|
89
|
+
as in ``EntryRef.value_nodes``.
|
|
88
90
|
|
|
89
91
|
Raises:
|
|
90
92
|
TypeError: If the new value's type does not match what the entry holds.
|
|
@@ -102,7 +104,11 @@ class ConfigStore:
|
|
|
102
104
|
else:
|
|
103
105
|
if ref.category != KEY_VALUE:
|
|
104
106
|
raise TypeError(f"Trying to change the type of variable '{key}'")
|
|
105
|
-
|
|
107
|
+
node = ref.value_nodes[0]
|
|
108
|
+
# A None node means an array position the file never wrote, which only a
|
|
109
|
+
# key_list entry can have; a key_value always has the one node it names.
|
|
110
|
+
assert node is not None
|
|
111
|
+
update_node_value(node, value)
|
|
106
112
|
return ref.value_nodes
|
|
107
113
|
|
|
108
114
|
def add(self, key: str, raw_key: str, value: Any) -> EntryRef:
|