5
5
from lxml import etree
6
6
import lxml .html
7
7
import subprocess as sp
8
- from azure .storage .blob import BlobClient
9
- from pathlib import Path
10
- from typing import List
8
+ from typing import List , Dict
11
9
from github import Github
12
10
from github .Repository import Repository
13
11
import time
16
14
17
15
from util import add_certificate
18
16
19
- SERVICE_TEST_PATH = {}
20
17
MAIN_REPO_SWAGGER = 'https://github.com/Azure/azure-rest-api-specs/tree/main'
21
18
PR_URL = 'https://github.com/Azure/azure-rest-api-specs/pull/'
22
19
FAILED_RESULT = []
20
+ SKIP_TEXT = '-, -, -, -\n '
23
21
24
22
def my_print (cmd ):
25
23
print ('== ' + cmd + ' ==\n ' )
@@ -120,14 +118,15 @@ def output_package_size(self) -> str:
120
118
else :
121
119
return self .package_size
122
120
123
- def write_to_list (self ) :
121
+ def write_to_list (self , sdk_folder : str ) -> str :
124
122
response = self .project_html ("/#history" )
125
123
if 199 < response .status_code < 400 :
126
124
self .get_release_dict (response )
127
125
self .bot_analysis ()
128
- return '{package_name},{pypi_link},{track1_latest_version},{track1_latest_release_date},' \
126
+ return '{sdk_folder}/{ package_name},{pypi_link},{track1_latest_version},{track1_latest_release_date},' \
129
127
'{track1_ga_version},{track2_latest_version},{track2_latest_release_date},{track2_ga_version},' \
130
128
'{cli_version},{track_config},{bot},{readme_link},{multiapi},{whl_size},' .format (
129
+ sdk_folder = sdk_folder .split ('/' )[0 ],
131
130
package_name = self ._package_name ,
132
131
pypi_link = self .pypi_link ,
133
132
track1_latest_version = self .track1_latest_version ,
@@ -144,7 +143,7 @@ def write_to_list(self):
144
143
whl_size = self .output_package_size ())
145
144
else :
146
145
self .pypi_link = 'NA'
147
- return
146
+ return ''
148
147
149
148
def find_track1_ga_version (self , versions : List [str ]) -> None :
150
149
if '1.0.0' in versions :
@@ -210,35 +209,32 @@ def bot_analysis(self):
210
209
self .bot_warning += 'Need to add track2 config.'
211
210
212
211
213
- def sdk_info_from_pypi (sdk_info , cli_dependency ):
212
+ def sdk_info_from_pypi (sdk_info : List [ Dict [ str , str ]] , cli_dependency ):
214
213
all_sdk_status = []
215
214
add_certificate (str (Path ('../venv-sdk/lib/python3.8/site-packages/certifi/cacert.pem' )))
216
215
for package in sdk_info :
217
- if ',' in package :
218
- package = package .split (',' )
219
- sdk_name = package [0 ].strip ()
220
- if sdk_name in cli_dependency .keys ():
221
- cli_version = cli_dependency [sdk_name ]
222
- else :
223
- cli_version = 'NA'
224
- track_config = package [1 ].strip ()
225
- readme_link = package [2 ].strip ()
226
- rm_link = package [3 ].strip ()
227
- multi_api = package [4 ].strip ()
228
- pypi_ins = PyPIClient (package_name = sdk_name , track_config = track_config ,
229
- readme_link = readme_link , rm_link = rm_link , cli_version = cli_version , multi_api = multi_api )
230
- text_to_write = pypi_ins .write_to_list ()
231
- if pypi_ins .pypi_link != 'NA' :
232
- if sdk_name == 'azure-mgmt-resource' :
233
- test_result = run_playback_test ('resources' )
234
- else :
235
- try :
236
- service_name = [k for k , v in SERVICE_TEST_PATH .items () if sdk_name in v ][0 ]
237
- test_result = run_playback_test (service_name )
238
- except :
239
- print (f'[Error] fail to play back test recordings: { sdk_name } ' )
240
- text_to_write += test_result
241
- all_sdk_status .append (text_to_write )
216
+ sdk_name = package ['package_name' ]
217
+ if sdk_name in cli_dependency .keys ():
218
+ cli_version = cli_dependency [sdk_name ]
219
+ else :
220
+ cli_version = 'NA'
221
+ track_config = package ['track_config' ]
222
+ readme_link = package ['readme_python_path' ]
223
+ rm_link = package ['readme_html' ]
224
+ multi_api = package ['multi_api' ]
225
+ pypi_ins = PyPIClient (package_name = sdk_name , track_config = track_config ,
226
+ readme_link = readme_link , rm_link = rm_link , cli_version = cli_version , multi_api = multi_api )
227
+ sdk_folder = package ['sdk_folder' ]
228
+ text_to_write = pypi_ins .write_to_list (sdk_folder )
229
+ service_name = package ['service_name' ]
230
+ if pypi_ins .pypi_link != 'NA' :
231
+ test_result = SKIP_TEXT
232
+ try :
233
+ test_result = run_playback_test (service_name , sdk_folder )
234
+ except :
235
+ print (f'[Error] fail to play back test recordings: { sdk_name } ' )
236
+ text_to_write += test_result
237
+ all_sdk_status .append (text_to_write )
242
238
243
239
my_print (f'total pypi package kinds: { len (all_sdk_status )} ' )
244
240
return all_sdk_status
@@ -264,12 +260,12 @@ def get_test_result(txt_path):
264
260
return f'{ coverage } , { passed } , { failed } , { skipped } \n '
265
261
266
262
267
- def run_playback_test (service_name ):
263
+ def run_playback_test (service_name : str , sdk_folder : str ):
268
264
if os .getenv ('SKIP_COVERAGE' ) in ('true' , 'yes' ):
269
- return '-, -, -, - \n '
265
+ return SKIP_TEXT
270
266
271
267
# eg: coverage_path='$(pwd)/sdk-repo/sdk/containerregistry/azure-mgmt-containerregistry/azure/mgmt/containerregistry/'
272
- coverage_path = '' .join ([os .getenv ('SDK_REPO' ), '/sdk/' , SERVICE_TEST_PATH [ service_name ] ])
268
+ coverage_path = '' .join ([os .getenv ('SDK_REPO' ), '/sdk/' , sdk_folder ])
273
269
service_path = coverage_path .split ('/azure/mgmt' )[0 ]
274
270
test_path = service_path + '/tests'
275
271
if os .path .exists (test_path ):
@@ -295,12 +291,12 @@ def run_playback_test(service_name):
295
291
if os .path .exists (service_path + '/result.txt' ):
296
292
return get_test_result (service_path + '/result.txt' )
297
293
298
- return '-, -, -, - \n '
294
+ return SKIP_TEXT
299
295
300
296
301
297
def write_to_csv (sdk_status_list , csv_name ):
302
298
with open (csv_name , 'w' ) as file_out :
303
- file_out .write ('package name,'
299
+ file_out .write ('foler/ package name,'
304
300
'pypi link,'
305
301
'latest track1 version,'
306
302
'latest track1 release date,'
@@ -360,17 +356,16 @@ def read_file(file_name):
360
356
return content
361
357
362
358
363
- def find_test_path (line : str , service_name : str ) -> bool :
359
+ def find_test_path (line : str ) -> str :
364
360
line = line .strip ('\n ' ) + '\n '
365
361
try :
366
- SERVICE_TEST_PATH [service_name ] = re .findall ('output-folder: \$\(python-sdks-folder\)/(.*?)\n ' , line )[0 ]
367
- return True
362
+ return re .findall ('output-folder: \$\(python-sdks-folder\)/(.*?)\n ' , line )[0 ]
368
363
except :
369
364
FAILED_RESULT .append ('[Fail to find sdk path] ' + line )
370
- return False
365
+ return ''
371
366
372
367
373
- def sdk_info_from_swagger ():
368
+ def sdk_info_from_swagger () -> List [ Dict [ str , str ]] :
374
369
sdk_name_re = re .compile (r'azure-mgmt-[a-z]+-*([a-z])+' )
375
370
sdk_folder_re = re .compile ('output-folder: \$\(python-sdks-folder\)/' )
376
371
resource_manager = []
@@ -379,7 +374,7 @@ def sdk_info_from_swagger():
379
374
readme_folders = glob .glob (target_file_pattern )
380
375
my_print (f'total readme folders: { len (readme_folders )} ' )
381
376
for folder in readme_folders :
382
- found_sdk_folder = False
377
+ sdk_folder = ''
383
378
multi_api = ''
384
379
linux_folder = Path (folder ).as_posix ()
385
380
service_name = re .findall (r'specification/(.*?)/resource-manager/' , linux_folder )[0 ]
@@ -395,16 +390,16 @@ def sdk_info_from_swagger():
395
390
track_config += 1
396
391
if readme_python == 'NA' and sdk_name_re .search (line ) is not None and package_name == '' :
397
392
package_name = sdk_name_re .search (line ).group ()
398
- if sdk_folder_re .search (line ) and not found_sdk_folder :
399
- found_sdk_folder = find_test_path (line , service_name )
393
+ if sdk_folder_re .search (line ) and not sdk_folder :
394
+ sdk_folder = find_test_path (line )
400
395
401
396
if readme_python != 'NA' :
402
397
readme_python_text = read_file (readme_python )
403
398
for text in readme_python_text :
404
399
if sdk_name_re .search (text ) is not None :
405
400
package_name = sdk_name_re .search (text ).group ()
406
- if sdk_folder_re .search (text ) and not found_sdk_folder :
407
- found_sdk_folder = find_test_path (text , service_name )
401
+ if sdk_folder_re .search (text ) and not sdk_folder :
402
+ sdk_folder = find_test_path (text )
408
403
if 'batch:' in text and multi_api == '' :
409
404
multi_api = 'fake'
410
405
print (f'*********{ service_name } is fake ' )
@@ -416,11 +411,15 @@ def sdk_info_from_swagger():
416
411
readme_html = folder .replace (SWAGGER_FOLDER , MAIN_REPO_SWAGGER )
417
412
readme_html = Path (readme_html ).as_posix ()
418
413
if package_name != '' :
419
- resource_manager .append ('{},{},{},{},{}\n ' .format (package_name ,
420
- track_config ,
421
- readme_python ,
422
- readme_html ,
423
- multi_api ))
414
+ resource_manager .append ({
415
+ 'package_name' : package_name .strip (),
416
+ 'track_config' : track_config ,
417
+ 'readme_python_path' : readme_python .strip (),
418
+ 'readme_html' : readme_html .strip (),
419
+ 'multi_api' : multi_api .strip (),
420
+ 'sdk_folder' : sdk_folder .strip (), # eg: resources/azure-mgmt-resource/azure/mgmt/resource
421
+ 'service_name' : service_name ,
422
+ })
424
423
my_print (f'{ folder } : { package_name } ' )
425
424
426
425
my_print (f'total package kinds: { len (resource_manager )} ' )
0 commit comments