@@ -76,6 +76,12 @@ def start(self, items: list[Any]) -> dict:
7676 if not isinstance (item , dict ):
7777 continue
7878 for block_name , block_data in item .items ():
79+ # Pluralize indexed blocks (e.g., period -> periods)
80+ if isinstance (block_data , dict ) and all (isinstance (k , int ) for k in block_data .keys ()):
81+ # This is an indexed block, use plural form
82+ if not block_name .endswith ('s' ):
83+ block_name = block_name + 's'
84+
7985 if block_name not in merged :
8086 merged [block_name ] = block_data
8187 else :
@@ -163,12 +169,27 @@ def filename(self, items: list[Any]) -> Path:
163169 def string (self , items : list [Any ]) -> str :
164170 return items [0 ].strip ("\" '" )
165171
172+ def simple_string (self , items : list [Any ]) -> str :
173+ """Handle simple string (unquoted word or escaped string)."""
174+ return str (items [0 ]).strip ("\" '" )
175+
166176 def integer (self , items : list [Any ]) -> int :
167177 return int (items [0 ])
168178
169179 def double (self , items : list [Any ]) -> float :
170180 return float (items [0 ])
171181
182+ def number (self , items : list [Any ]) -> int | float :
183+ """Handle generic number (could be int or float)."""
184+ value = str (items [0 ])
185+ try :
186+ if "." in value or "e" in value .lower ():
187+ return float (value )
188+ else :
189+ return int (value )
190+ except ValueError :
191+ return float (value )
192+
172193 def data (self , items : list [Any ]) -> np .ndarray :
173194 return np .array (items )
174195
@@ -222,6 +243,10 @@ def block_index(self, items: list[Any]) -> int:
222243 """Extract block index (e.g., period number)."""
223244 return items [0 ]
224245
246+ def stress_period_data (self , items : list [Any ]) -> list [Any ]:
247+ """Handle stress period data (list of values for a single record)."""
248+ return items
249+
225250 @staticmethod
226251 def try_create_dataarray (array_info : dict ) -> dict :
227252 control = array_info ["control" ]
@@ -251,6 +276,12 @@ def __default__(self, data, children, meta):
251276 # Unexpected structure, fall back to default
252277 return super ().__default__ (data , children , meta )
253278 elif data .endswith ("_fields" ):
279+ # Check if this is a period_fields which contains list data (stress_period_data)
280+ # rather than named field tuples
281+ if children and not isinstance (children [0 ], tuple ):
282+ # This is list data (e.g., stress_period_data records)
283+ # Return as stress_period_data key
284+ return {"stress_period_data" : children }
254285 return {item [0 ].lower (): item [1 ] for item in children }
255286 elif (field := self .fields .get (data , None )) is not None :
256287 if field .type == "keyword" :
0 commit comments