6
6
import logging
7
7
import os
8
8
import subprocess
9
- from dataclasses import dataclass , fields
9
+ from dataclasses import dataclass
10
10
from enum import Enum
11
11
from pathlib import Path
12
12
from typing import Any
13
13
14
14
import tomli
15
15
import tomli_w
16
+ from deprecated import deprecated
16
17
17
18
logger = logging .getLogger (__name__ )
18
19
21
22
class Bin :
22
23
name : str
23
24
path : str
24
- _remainder : dict [str , Any ]
25
+ _raw : dict [str , Any ]
25
26
26
27
def to_json (self ) -> dict [str , Any ]:
27
- return { "name" : self .name , "path" : self . path , ** self . _remainder }
28
+ return self ._raw
28
29
29
30
@staticmethod
30
31
def from_json (data : dict [str , Any ]) -> Bin :
31
32
data = dict (data )
32
- return Bin (data .pop ("name" ), data .pop ("path" ), _remainder = data )
33
+ return Bin (data .get ("name" , "" ), data .get ("path" , "" ), _raw = data )
34
+
35
+ @property
36
+ @deprecated (reason = "use Bin._raw instead" , version = "0.37.0" )
37
+ def _remainder (self ) -> dict [str , Any ]:
38
+ return self ._raw
33
39
34
40
35
41
# TODO: Differentiate between lib kinds?
@@ -63,7 +69,7 @@ class WorkspaceMember:
63
69
@dataclass
64
70
class CargoMetadata :
65
71
_path : Path
66
- _data : dict [str , Any ]
72
+ _raw : dict [str , Any ]
67
73
68
74
workspaceMembers : list [WorkspaceMember ]
69
75
artifacts : list [Artifact ]
@@ -144,71 +150,89 @@ def of(cls, path: Path, data: dict[str, Any]) -> CargoMetadata:
144
150
145
151
return cls (path , data , workspace_members , artifacts , Path (data ["target_directory" ]))
146
152
153
+ @property
154
+ @deprecated (reason = "use CargoMetadata._raw instead" , version = "0.37.0" )
155
+ def _data (self ) -> dict [str , Any ]:
156
+ return self ._raw
157
+
147
158
148
159
@dataclass
149
160
class Package :
150
161
name : str
151
162
version : str | None
152
163
edition : str | None
153
- unhandled : dict [str , Any ] | None
164
+ _raw : dict [str , Any ]
154
165
155
166
@classmethod
156
- def from_json (cls , json : dict [str , str ]) -> Package :
157
- cloned = dict (json )
158
- name = cloned . pop ("name" )
159
- version = cloned . pop ("version" , None )
160
- edition = cloned . pop ("edition" , None )
161
- return Package (name , version , edition , cloned )
167
+ def from_json (cls , json : dict [str , Any ]) -> Package :
168
+ _raw = dict (json )
169
+ name = _raw . get ("name" , " " )
170
+ version = _raw . get ("version" , None )
171
+ edition = _raw . get ("edition" , None )
172
+ return Package (name , version , edition , _raw )
162
173
163
- def to_json (self ) -> dict [str , str ]:
164
- values = {f .name : getattr (self , f .name ) for f in fields (self ) if f .name != "unhandled" }
165
- if self .unhandled is not None :
166
- values .update ({k : v for k , v in self .unhandled .items () if v is not None })
167
- return {k : v for k , v in values .items () if v is not None }
174
+ def to_json (self ) -> dict [str , Any ]:
175
+ return {k : v for k , v in self ._raw .items () if v is not None }
176
+
177
+ @property
178
+ @deprecated (reason = "use Package._raw instead" , version = "0.37.0" )
179
+ def unhandled (self ) -> dict [str , Any ]:
180
+ return self ._raw
168
181
169
182
170
183
@dataclass
171
184
class WorkspacePackage :
172
185
version : str
173
- unhandled : dict [str , Any ] | None
186
+ _raw : dict [str , Any ]
174
187
175
188
@classmethod
176
- def from_json (cls , json : dict [str , str ]) -> WorkspacePackage :
189
+ def from_json (cls , json : dict [str , Any ]) -> WorkspacePackage :
177
190
cloned = dict (json )
178
- version = cloned .pop ("version" )
191
+ version = cloned .get ("version" , " " )
179
192
return WorkspacePackage (version , cloned )
180
193
181
- def to_json (self ) -> dict [str , str ]:
182
- values = {f .name : getattr (self , f .name ) for f in fields (self ) if f .name != "unhandled" }
183
- if self .unhandled is not None :
184
- values .update ({k : v for k , v in self .unhandled .items () if v is not None })
185
- return {k : v for k , v in values .items () if v is not None }
194
+ def to_json (self ) -> dict [str , Any ]:
195
+ return {k : v for k , v in self ._raw .items () if v is not None }
196
+
197
+ @property
198
+ @deprecated (reason = "use WorkspacePackage._raw instead" , version = "0.37.0" )
199
+ def unhandled (self ) -> dict [str , Any ]:
200
+ return self ._raw
186
201
187
202
188
203
@dataclass
189
204
class Workspace :
190
205
package : WorkspacePackage | None
191
206
members : list [str ] | None
192
- unhandled : dict [str , Any ] | None
207
+ dependencies : Dependencies | None
208
+ build_dependencies : Dependencies | None
209
+ _raw : dict [str , Any ]
193
210
194
211
@classmethod
195
212
def from_json (cls , json : dict [str , Any ]) -> Workspace :
196
- cloned = dict (json )
197
213
return Workspace (
198
- WorkspacePackage .from_json (cloned .pop ("package" )) if "package" in cloned else None ,
199
- cloned .pop ("members" ) if "members" in cloned else None ,
200
- cloned ,
214
+ WorkspacePackage .from_json (json ["package" ]) if "package" in json else None ,
215
+ json .get ("members" ),
216
+ Dependencies .from_json (json ["dependencies" ]) if "dependencies" in json else None ,
217
+ Dependencies .from_json (json ["build-dependencies" ]) if "build-dependencies" in json else None ,
218
+ json ,
201
219
)
202
220
203
221
def to_json (self ) -> dict [str , Any ]:
204
- values = {
205
- "package" : self .package .to_json () if self .package else None ,
206
- "members" : self .members if self .members else None ,
207
- }
208
- if self .unhandled is not None :
209
- values .update ({k : v for k , v in self .unhandled .items () if v is not None })
222
+ values = self ._raw
223
+ values .update (
224
+ {
225
+ "package" : self .package .to_json () if self .package else None ,
226
+ "members" : self .members if self .members else None ,
227
+ }
228
+ )
210
229
return {k : v for k , v in values .items () if v is not None }
211
230
231
+ @property
232
+ @deprecated (reason = "use Workspace._raw instead" , version = "0.37.0" )
233
+ def unhandled (self ) -> dict [str , Any ]:
234
+ return self ._raw
235
+
212
236
213
237
@dataclass
214
238
class Dependencies :
@@ -226,7 +250,7 @@ def to_json(self) -> dict[str, Any]:
226
250
@dataclass
227
251
class CargoManifest :
228
252
_path : Path
229
- _data : dict [str , Any ]
253
+ _raw : dict [str , Any ]
230
254
231
255
package : Package | None
232
256
workspace : Workspace | None
@@ -255,7 +279,7 @@ def of(cls, path: Path, data: dict[str, Any]) -> CargoManifest:
255
279
)
256
280
257
281
def to_json (self ) -> dict [str , Any ]:
258
- result = self ._data .copy ()
282
+ result = self ._raw .copy ()
259
283
if self .bin :
260
284
result ["bin" ] = [x .to_json () for x in self .bin ]
261
285
else :
@@ -277,3 +301,8 @@ def save(self, path: Path | None = None) -> None:
277
301
path = path or self ._path
278
302
with path .open ("wb" ) as fp :
279
303
tomli_w .dump (self .to_json (), fp )
304
+
305
+ @property
306
+ @deprecated (reason = "use CargoManifest._raw instead" , version = "0.37.0" )
307
+ def _data (self ) -> dict [str , Any ]:
308
+ return self ._raw
0 commit comments