11from abc import ABC
22from collections .abc import MutableMapping
33
4- from attrs import Attribute
5- from modflow_devtools .dfn import Dfn , Var
4+ from modflow_devtools .dfn import Dfn , Field
65from xattree import xattree
76
8- from flopy4 .mf6 .spec import fields_dict
7+ from flopy4 .mf6 .spec import fields_dict , to_dfn_field
98from flopy4 .uio import IO , Loader , Writer
109
1110COMPONENTS = {}
@@ -30,11 +29,8 @@ class Component(ABC, MutableMapping):
3029
3130 @classmethod
3231 def __attrs_init_subclass__ (cls ):
33- # add class to the component registry
3432 COMPONENTS [cls .__name__ .lower ()] = cls
35-
36- def __attrs_post_init__ (self ):
37- self ._dfn = self ._get_dfn ()
33+ cls .dfn = cls .get_dfn ()
3834
3935 def __getitem__ (self , key ):
4036 return self .children [key ] # type: ignore
@@ -51,37 +47,22 @@ def __iter__(self):
5147 def __len__ (self ):
5248 return len (self .children ) # type: ignore
5349
54- @property
55- def dfn (self ) -> Dfn :
56- """Return the component's definition."""
57- return self ._dfn
58-
59- def _get_dfn (self ) -> Dfn :
60- def _to_dfn_spec (attribute : Attribute ) -> Var :
61- return Var (
62- name = attribute .name ,
63- type = attribute .type ,
64- shape = attribute .metadata .get ("dims" , None ),
65- block = attribute .metadata .get ("block" , None ),
66- default = attribute .default ,
67- children = {k : _to_dfn_spec (v ) for k , v in fields_dict (attribute .type )} # type: ignore
68- if attribute .metadata .get ("kind" , None ) == "child" # type: ignore
69- else None , # type: ignore
70- )
71-
72- fields = {k : _to_dfn_spec (v ) for k , v in fields_dict (self .__class__ ).items ()}
73- blocks : dict [str , dict [str , Var ]] = {}
74- for k , v in fields .items ():
75- if (block := v .get ("block" , None )) is not None :
76- blocks .setdefault (block , {})[k ] = v
50+ @classmethod
51+ def get_dfn (cls ) -> Dfn :
52+ fields = {field_name : to_dfn_field (field ) for field_name , field in fields_dict (cls ).items ()}
53+ blocks : dict [str , dict [str , Field ]] = {}
54+ for field_name , field in fields .items ():
55+ if (block := field .get ("block" , None )) is not None :
56+ blocks .setdefault (block , {})[field_name ] = field
7757 else :
78- blocks [k ] = v
58+ blocks [field_name ] = field
59+
7960 return Dfn (
80- name = self . name , # type: ignore
81- advanced = getattr (self , "advanced_package" , False ),
82- multi = getattr (self , "multi_package" , False ),
83- ref = getattr (self , "sub_package" , None ),
84- sln = getattr (self , "solution_package" , None ),
61+ name = cls . __name__ . lower (),
62+ advanced = getattr (cls , "advanced_package" , False ),
63+ multi = getattr (cls , "multi_package" , False ),
64+ ref = getattr (cls , "sub_package" , None ),
65+ sln = getattr (cls , "solution_package" , None ),
8566 ** blocks ,
8667 )
8768
0 commit comments