6
6
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7
7
8
8
"""
9
+
9
10
import os
10
11
import generate_ids
11
12
import util
12
13
import re
13
14
import hashlib
14
15
import json
15
- import yaml
16
16
import copy
17
17
from templates .helper import param_traits , type_traits , value_traits
18
18
import ctypes
19
19
import itertools
20
+ from typing import Optional
21
+ from version import Version
22
+
20
23
21
- default_version = "0.9"
22
- all_versions = ["0.6" , "0.7" , "0.8" , "0.9" ]
24
+ default_version = Version ( "0.10" )
25
+ all_versions = [Version ( ver ) for ver in [ "0.6" , "0.7" , "0.8" , "0.9" , "0.10" ] ]
23
26
24
27
"""
25
28
preprocess object
@@ -105,14 +108,14 @@ def __validate_version(d, prefix="", base_version=default_version):
105
108
raise Exception (prefix + "'version' must be a string: '%s'" % type (d ['version' ]))
106
109
107
110
try :
108
- version = str (float ( d ['version' ]) )
111
+ version = str (d ['version' ])
109
112
except :
110
113
version = None
111
114
112
115
if version != d ['version' ]:
113
116
raise Exception (prefix + "'version' invalid value: '%s'" % d ['version' ])
114
117
115
- return float (d .get ('version' , base_version ))
118
+ return Version (d .get ('version' , base_version ))
116
119
117
120
def __validate_tag (d , key , tags , case ):
118
121
for x in tags :
@@ -127,7 +130,7 @@ def __validate_desc(desc):
127
130
raise Exception (prefix + "'version' must be a string: '%s'" % type (k ))
128
131
129
132
try :
130
- version = str (float ( k ) )
133
+ version = str (k )
131
134
except :
132
135
version = None
133
136
@@ -212,8 +215,8 @@ def __validate_etors(d, tags):
212
215
typed = d .get ('typed_etors' , False )
213
216
214
217
value = - 1
215
- d_ver = d .get ('version' , default_version )
216
- max_ver = float ( d_ver )
218
+ d_ver = Version ( d .get ('version' , default_version ) )
219
+ max_ver = d_ver
217
220
for i , item in enumerate (d ['etors' ]):
218
221
prefix = "'etors'[%s] " % i
219
222
if not isinstance (item , dict ):
@@ -300,8 +303,8 @@ def __validate_members(d, tags, meta):
300
303
if not isinstance (d ['members' ], list ):
301
304
raise Exception ("'members' must be a sequence: '%s'" % type (d ['members' ]))
302
305
303
- d_ver = d .get ('version' , default_version )
304
- max_ver = float ( d_ver )
306
+ d_ver = Version ( d .get ('version' , default_version ) )
307
+ max_ver = d_ver
305
308
for i , item in enumerate (d ['members' ]):
306
309
prefix = "'members'[%s] " % i
307
310
if not isinstance (item , dict ):
@@ -342,8 +345,8 @@ def __validate_params(d, tags, meta):
342
345
if not isinstance (d ['params' ], list ):
343
346
raise Exception ("'params' must be a sequence: '%s'" % type (d ['params' ]))
344
347
345
- d_ver = d .get ('version' , default_version )
346
- max_ver = float ( d_ver )
348
+ d_ver = Version ( d .get ('version' , default_version ) )
349
+ max_ver = d_ver
347
350
min = {'[in]' : None , '[out]' : None , '[in,out]' : None }
348
351
for i , item in enumerate (d ['params' ]):
349
352
prefix = "'params'[%s] " % i
@@ -501,24 +504,23 @@ def __validate_union_tag(d):
501
504
"""
502
505
filters object by version
503
506
"""
504
- def _filter_version (d , max_ver ) :
505
- ver = float (d .get ('version' , default_version ))
507
+ def _filter_version (d , max_ver : Version ) -> Optional [ dict ] :
508
+ ver = Version (d .get ('version' , default_version ))
506
509
if ver > max_ver :
507
510
return None
508
511
509
- def __filter_desc (d ):
512
+ def __filter_desc (d ) -> dict :
510
513
if 'desc' in d and isinstance (d ['desc' ], dict ):
511
514
for k , v in d ['desc' ].items ():
512
- if float (k ) <= max_ver :
513
- desc = v
514
- d ['desc' ] = desc
515
+ if Version (k ) <= max_ver :
516
+ d ['desc' ] = v
515
517
return d
516
518
517
519
flt = []
518
520
type = d ['type' ]
519
521
if 'enum' == type :
520
522
for e in d ['etors' ]:
521
- ver = float (e .get ('version' , default_version ))
523
+ ver = Version (e .get ('version' , default_version ))
522
524
if ver <= max_ver :
523
525
flt .append (__filter_desc (e ))
524
526
if d ['name' ].endswith ('version_t' ):
@@ -531,14 +533,14 @@ def __filter_desc(d):
531
533
532
534
elif 'function' == type :
533
535
for p in d ['params' ]:
534
- ver = float (p .get ('version' , default_version ))
536
+ ver = Version (p .get ('version' , default_version ))
535
537
if ver <= max_ver :
536
538
flt .append (__filter_desc (p ))
537
539
d ['params' ] = flt
538
540
539
541
elif 'struct' == type or 'union' == type or 'class' == type :
540
542
for m in d .get ('members' ,[]):
541
- ver = float (m .get ('version' , default_version ))
543
+ ver = Version (m .get ('version' , default_version ))
542
544
if ver <= max_ver :
543
545
flt .append (__filter_desc (m ))
544
546
d ['members' ] = flt
@@ -548,15 +550,15 @@ def __filter_desc(d):
548
550
"""
549
551
creates docs per version
550
552
"""
551
- def _make_versions (d , max_ver ) :
553
+ def _make_versions (d , max_ver : Version ) -> list [ Version ] :
552
554
docs = []
553
555
type = d ['type' ]
554
556
if 'function' == type or 'struct' == type :
555
557
for ver in all_versions :
556
- if float ( ver ) > max_ver :
558
+ if ver > max_ver :
557
559
break
558
560
559
- dv = _filter_version (copy .deepcopy (d ), float ( ver ) )
561
+ dv = _filter_version (copy .deepcopy (d ), ver )
560
562
if not dv :
561
563
continue
562
564
@@ -936,7 +938,7 @@ def parse(section, version, tags, meta, ref):
936
938
if not _validate_doc (f , d , tags , line_nums [i ], meta ):
937
939
continue
938
940
939
- d = _filter_version (d , float ( version ) )
941
+ d = _filter_version (d , version )
940
942
if not d :
941
943
continue
942
944
@@ -948,7 +950,10 @@ def parse(section, version, tags, meta, ref):
948
950
# extract header from objects
949
951
if re .match (r"header" , d ['type' ]):
950
952
header = d
951
- header ['ordinal' ] = int (int (header .get ('ordinal' ,"1000" )) * float (header .get ('version' ,"1.0" )))
953
+ header ["ordinal" ] = int (
954
+ int (header .get ("ordinal" , "1000" ))
955
+ * Version (header .get ("version" , "1.0" )).major
956
+ )
952
957
header ['ordinal' ] *= 1000 if re .match (r"extension" , header .get ('desc' ,"" ).lower ()) else 1
953
958
header ['ordinal' ] *= 1000 if re .match (r"experimental" , header .get ('desc' ,"" ).lower ()) else 1
954
959
basename = os .path .splitext (os .path .basename (f ))[0 ]
@@ -961,7 +966,7 @@ def parse(section, version, tags, meta, ref):
961
966
for c in '_-' :
962
967
name = name .replace (c , ' ' )
963
968
elif header :
964
- for d in _make_versions (d , float ( version ) ):
969
+ for d in _make_versions (d , version ):
965
970
objects .append (d )
966
971
meta = _generate_meta (d , header ['ordinal' ], meta )
967
972
0 commit comments