Source code for fgen.data_models.module
"""
Data model of a Fortran module
"""
from __future__ import annotations
from attrs import define, field
from fgen.data_models.fortran_derived_type import FortranDerivedType
from fgen.data_models.module_requirement import ModuleRequirement
[docs]@define
class Module:
"""
Data model of a Fortran module
It is assumed that each module defines a single derived type.
"""
name: str
"""Name of the module"""
description: str
"""Description of the module"""
provides: FortranDerivedType
"""Derived type that the module defines"""
truncated_name: str = field()
"""
If provided, the name to use when creating the Fortran wrapper module.
If not supplied, we simply use the value of :attr:`name`.
This can be used to avoid line length limits for the wrappers
when we are wrapping modules with very long names.
"""
requirements: list[ModuleRequirement] = field(factory=list)
"""
Requirements from other modules
Put another way, the modules that this module requires in order to run.
"""
[docs] @truncated_name.default
def truncated_name_default(self) -> str:
"""
Default value for :attr:`truncated_name`
""" # noqa: D401
return self.name
@property
def wrapper_module_name(self) -> str:
"""
Name for the Fortran wrapper module
By default the wrapper module name is derived from the :attr:`name`,
but, in some cases, the complete module name can be too long,
leading to the wrapper module not being able to be built.
In this case a :attr:`truncated_name` can be used
to derive a shortened wrapper module name.
Given that this wrapper module is only used by autogenerated code the
readability of the name isn't as important as the full module.
"""
return f"{self.truncated_name}_w"
@property
def manager_module_name(self) -> str:
"""
Name for the Fortran manager module
By default the manager module name is derived from the :attr:`name`,
but, in some cases, the complete module name can be too long,
leading to the manager module not being able to be built.
In this case a :attr:`truncated_name` can be used
to derive a shortened manager module name.
Given that this manager module is only used by autogenerated code the
readability of the name isn't as important as the full module.
"""
return f"{self.truncated_name}_manager"
[docs] def get_requirement_that_provides(self, provides: str) -> ModuleRequirement:
"""
Get the module requirement that provides the specified type
Parameters
----------
provides
Name of the provided type
Returns
-------
Module requirement that provides this type
Raises
------
ValueError
No module requirement is found that provides ``provides``
is part of ``self.requirements``.
"""
for requirement in self.requirements:
if requirement.provides == provides:
return requirement
msg = f"No requirement provides {provides}. {self.requirements=}"
raise ValueError(msg)