def _get_model_info(model_name):
<EOL>split_name = re.split(r'<STR_LIT>', model_name.strip().upper())<EOL>sep_chars = ('<STR_LIT>', '<STR_LIT:U+0020>', '<STR_LIT:->', '<STR_LIT:_>')<EOL>gen_seps = itertools.combinations_with_replacement(<EOL>sep_chars, len(split_name) - <NUM_LIT:1><EOL>)<EOL>test_names = ("<STR_LIT>".join((n for n in itertools.chain(*list(zip(split_name,<EOL>s + ('<STR_LIT>',))))))<EOL>for s in gen_seps)<EOL>match_names = list([name for name in test_names if name<EOL>in _get_supported_models()])<EOL>if not len(match_names):<EOL><INDENT>raise ValueError("<STR_LIT>".format(model_name))<EOL><DEDENT>elif len(match_names) > <NUM_LIT:1>:<EOL><INDENT>raise ValueError("<STR_LIT>"<EOL>.format(model_name))<EOL><DEDENT>valid_model_name = match_names[<NUM_LIT:0>]<EOL>parent_models = _find_references(valid_model_name)<EOL>model_spec = dict()<EOL>for m in parent_models:<EOL><INDENT>model_spec.update(MODELS[m])<EOL><DEDENT>model_spec.pop('<STR_LIT>')<EOL>model_spec['<STR_LIT>'] = parent_models[<NUM_LIT:0>]<EOL>model_spec['<STR_LIT>'] = valid_model_name<EOL>return model_spec<EOL>
Get the grid specifications for a given model.

Parameters
----------
model_name : string
    Name of the model. Supports multiple formats
    (e.g., 'GEOS5', 'GEOS-5' or 'GEOS_5').

Returns
-------
specifications : dict
    Grid specifications as a dictionary.

Raises
------
ValueError
    If the model is not supported (see `models`) or if the given
    `model_name` corresponds to several entries in the list of
    supported models.