10
10
import typing as T
11
11
12
12
from . import version
13
+ from ..mesonlib import MesonException , lazy_property
13
14
from .. import mlog
14
- from ..mesonlib import MesonException
15
15
16
16
if T .TYPE_CHECKING :
17
17
from typing_extensions import Protocol , Self
@@ -65,7 +65,6 @@ def _raw_to_dataclass(raw: T.Mapping[str, object], cls: T.Type[_DI],
65
65
:param data: The raw data to look at
66
66
:param cls: The Dataclass derived type that will be created
67
67
:param msg: the header for the error message. Usually something like "In N structure".
68
- :param convert_version: whether to convert the version field to a Meson compatible one.
69
68
:return: The original data structure, but with all unknown keys removed.
70
69
"""
71
70
new_dict = {}
@@ -120,10 +119,9 @@ class Package:
120
119
autotests : bool = True
121
120
autobenches : bool = True
122
121
123
- api : str = dataclasses .field (init = False )
124
-
125
- def __post_init__ (self ) -> None :
126
- self .api = version .api (self .version )
122
+ @lazy_property
123
+ def api (self ) -> str :
124
+ return version .api (self .version )
127
125
128
126
@classmethod
129
127
def from_raw (cls , raw_pkg : raw .Package ) -> Self :
@@ -137,7 +135,7 @@ class SystemDependency:
137
135
"""
138
136
139
137
name : str
140
- version : T . List [ str ]
138
+ version : str = ''
141
139
optional : bool = False
142
140
feature : T .Optional [str ] = None
143
141
# TODO: convert values to dataclass
@@ -146,18 +144,18 @@ class SystemDependency:
146
144
@classmethod
147
145
def from_raw (cls , name : str , raw : T .Union [T .Dict [str , T .Any ], str ]) -> SystemDependency :
148
146
if isinstance (raw , str ):
149
- return cls ( name , SystemDependency . convert_version ( raw ))
147
+ raw = { 'version' : raw }
150
148
name = raw .get ('name' , name )
151
- version = SystemDependency . convert_version ( raw .get ('version' , '' ) )
149
+ version = raw .get ('version' , '' )
152
150
optional = raw .get ('optional' , False )
153
151
feature = raw .get ('feature' )
154
152
# Everything else are overrides when certain features are enabled.
155
153
feature_overrides = {k : v for k , v in raw .items () if k not in {'name' , 'version' , 'optional' , 'feature' }}
156
154
return cls (name , version , optional , feature , feature_overrides )
157
155
158
- @staticmethod
159
- def convert_version ( version : T . Optional [ str ] ) -> T .List [str ]:
160
- vers = version .split (',' ) if version else []
156
+ @lazy_property
157
+ def meson_version ( self ) -> T .List [str ]:
158
+ vers = self . version .split (',' ) if self . version else []
161
159
result : T .List [str ] = []
162
160
for v in vers :
163
161
v = v .strip ()
@@ -175,7 +173,7 @@ class Dependency:
175
173
"""Representation of a Cargo Dependency Entry."""
176
174
177
175
package : str
178
- version : T . List [ str ]
176
+ version : str = ''
179
177
registry : T .Optional [str ] = None
180
178
git : T .Optional [str ] = None
181
179
branch : T .Optional [str ] = None
@@ -185,28 +183,30 @@ class Dependency:
185
183
default_features : bool = True
186
184
features : T .List [str ] = dataclasses .field (default_factory = list )
187
185
188
- api : str = dataclasses .field (init = False )
186
+ @lazy_property
187
+ def meson_version (self ) -> T .List [str ]:
188
+ return version .convert (self .version )
189
189
190
- def __post_init__ (self ) -> None :
190
+ @lazy_property
191
+ def api (self ) -> str :
191
192
# Extract wanted API version from version constraints.
192
193
api = set ()
193
- for v in self .version :
194
+ for v in self .meson_version :
194
195
if v .startswith (('>=' , '==' )):
195
196
api .add (version .api (v [2 :].strip ()))
196
197
elif v .startswith ('=' ):
197
198
api .add (version .api (v [1 :].strip ()))
198
199
if not api :
199
- self . api = '0'
200
+ return '0'
200
201
elif len (api ) == 1 :
201
- self . api = api .pop ()
202
+ return api .pop ()
202
203
else :
203
204
raise MesonException (f'Cannot determine minimum API version from { self .version } .' )
204
205
205
206
@classmethod
206
207
def from_raw_dict (cls , name : str , raw_dep : raw .Dependency ) -> Dependency :
207
208
raw_dep .setdefault ('package' , name )
208
- return _raw_to_dataclass (raw_dep , cls , f'Dependency entry { name } ' ,
209
- version = version .convert )
209
+ return _raw_to_dataclass (raw_dep , cls , f'Dependency entry { name } ' )
210
210
211
211
@classmethod
212
212
def from_raw (cls , name : str , raw_depv : raw .DependencyV ) -> Dependency :
@@ -344,7 +344,6 @@ class Manifest:
344
344
dependencies : T .Dict [str , Dependency ] = dataclasses .field (default_factory = dict )
345
345
dev_dependencies : T .Dict [str , Dependency ] = dataclasses .field (default_factory = dict )
346
346
build_dependencies : T .Dict [str , Dependency ] = dataclasses .field (default_factory = dict )
347
- system_dependencies : T .Dict [str , SystemDependency ] = dataclasses .field (init = False )
348
347
lib : T .Optional [Library ] = None
349
348
bin : T .List [Binary ] = dataclasses .field (default_factory = list )
350
349
test : T .List [Test ] = dataclasses .field (default_factory = list )
@@ -357,7 +356,10 @@ class Manifest:
357
356
358
357
def __post_init__ (self ) -> None :
359
358
self .features .setdefault ('default' , [])
360
- self .system_dependencies = {k : SystemDependency .from_raw (k , v ) for k , v in self .package .metadata .get ('system-deps' , {}).items ()}
359
+
360
+ @lazy_property
361
+ def system_dependencies (self ) -> T .Dict [str , SystemDependency ]:
362
+ return {k : SystemDependency .from_raw (k , v ) for k , v in self .package .metadata .get ('system-deps' , {}).items ()}
361
363
362
364
@classmethod
363
365
def from_raw (cls , raw : raw .Manifest , path : str = '' ) -> Self :
0 commit comments