]>
Raphaƫl G. Git Repositories - youtubedl/blob - test/helper.py
   1 from __future__ 
import unicode_literals
 
  12 import youtube_dl
.extractor
 
  13 from youtube_dl 
import YoutubeDL
 
  14 from youtube_dl
.utils 
import ( 
  21 def get_params(override
=None): 
  22     PARAMETERS_FILE 
= os
.path
.join(os
.path
.dirname(os
.path
.abspath(__file__
)), 
  24     with io
.open(PARAMETERS_FILE
, encoding
='utf-8') as pf
: 
  25         parameters 
= json
.load(pf
) 
  27         parameters
.update(override
) 
  32     """ Remove a file if it exists """ 
  35     except OSError as ose
: 
  36         if ose
.errno 
!= errno
.ENOENT
: 
  40 def report_warning(message
): 
  42     Print the message to stderr, it will be prefixed with 'WARNING:' 
  43     If stderr is a tty file the 'WARNING:' will be colored 
  45     if sys
.stderr
.isatty() and os
.name 
!= 'nt': 
  46         _msg_header 
= '\033[0;33mWARNING:\033[0m' 
  48         _msg_header 
= 'WARNING:' 
  49     output 
= '%s %s\n' % (_msg_header
, message
) 
  50     if 'b' in getattr(sys
.stderr
, 'mode', '') or sys
.version_info
[0] < 3: 
  51         output 
= output
.encode(preferredencoding()) 
  52     sys
.stderr
.write(output
) 
  55 class FakeYDL(YoutubeDL
): 
  56     def __init__(self
, override
=None): 
  57         # Different instances of the downloader can't share the same dictionary 
  58         # some test set the "sublang" parameter, which would break the md5 checks. 
  59         params 
= get_params(override
=override
) 
  60         super(FakeYDL
, self
).__init
__(params
, auto_init
=False) 
  63     def to_screen(self
, s
, skip_eol
=None): 
  66     def trouble(self
, s
, tb
=None): 
  69     def download(self
, x
): 
  72     def expect_warning(self
, regex
): 
  73         # Silence an expected warning matching a regex 
  74         old_report_warning 
= self
.report_warning
 
  76         def report_warning(self
, message
): 
  77             if re
.match(regex
, message
): 
  79             old_report_warning(message
) 
  80         self
.report_warning 
= types
.MethodType(report_warning
, self
) 
  83 def gettestcases(include_onlymatching
=False): 
  84     for ie 
in youtube_dl
.extractor
.gen_extractors(): 
  85         for tc 
in ie
.get_testcases(include_onlymatching
): 
  89 md5 
= lambda s
: hashlib
.md5(s
.encode('utf-8')).hexdigest() 
  92 def expect_value(self
, got
, expected
, field
): 
  93     if isinstance(expected
, compat_str
) and expected
.startswith('re:'): 
  94         match_str 
= expected
[len('re:'):] 
  95         match_rex 
= re
.compile(match_str
) 
  98             isinstance(got
, compat_str
), 
  99             'Expected a %s object, but got %s for field %s' % ( 
 100                 compat_str
.__name
__, type(got
).__name
__, field
)) 
 102             match_rex
.match(got
), 
 103             'field %s (value: %r) should match %r' % (field
, got
, match_str
)) 
 104     elif isinstance(expected
, compat_str
) and expected
.startswith('startswith:'): 
 105         start_str 
= expected
[len('startswith:'):] 
 107             isinstance(got
, compat_str
), 
 108             'Expected a %s object, but got %s for field %s' % ( 
 109                 compat_str
.__name
__, type(got
).__name
__, field
)) 
 111             got
.startswith(start_str
), 
 112             'field %s (value: %r) should start with %r' % (field
, got
, start_str
)) 
 113     elif isinstance(expected
, compat_str
) and expected
.startswith('contains:'): 
 114         contains_str 
= expected
[len('contains:'):] 
 116             isinstance(got
, compat_str
), 
 117             'Expected a %s object, but got %s for field %s' % ( 
 118                 compat_str
.__name
__, type(got
).__name
__, field
)) 
 121             'field %s (value: %r) should contain %r' % (field
, got
, contains_str
)) 
 122     elif isinstance(expected
, type): 
 124             isinstance(got
, expected
), 
 125             'Expected type %r for field %s, but got value %r of type %r' % (expected
, field
, got
, type(got
))) 
 126     elif isinstance(expected
, dict) and isinstance(got
, dict): 
 127         expect_dict(self
, got
, expected
) 
 128     elif isinstance(expected
, list) and isinstance(got
, list): 
 130             len(expected
), len(got
), 
 131             'Expect a list of length %d, but got a list of length %d for field %s' % ( 
 132                 len(expected
), len(got
), field
)) 
 133         for index
, (item_got
, item_expected
) in enumerate(zip(got
, expected
)): 
 134             type_got 
= type(item_got
) 
 135             type_expected 
= type(item_expected
) 
 137                 type_expected
, type_got
, 
 138                 'Type mismatch for list item at index %d for field %s, expected %r, got %r' % ( 
 139                     index
, field
, type_expected
, type_got
)) 
 140             expect_value(self
, item_got
, item_expected
, field
) 
 142         if isinstance(expected
, compat_str
) and expected
.startswith('md5:'): 
 143             got 
= 'md5:' + md5(got
) 
 144         elif isinstance(expected
, compat_str
) and expected
.startswith('mincount:'): 
 146                 isinstance(got
, (list, dict)), 
 147                 'Expected field %s to be a list or a dict, but it is of type %s' % ( 
 148                     field
, type(got
).__name
__)) 
 149             expected_num 
= int(expected
.partition(':')[2]) 
 151                 self
, len(got
), expected_num
, 
 152                 'Expected %d items in field %s, but only got %d' % (expected_num
, field
, len(got
))) 
 156             'Invalid value for field %s, expected %r, got %r' % (field
, expected
, got
)) 
 159 def expect_dict(self
, got_dict
, expected_dict
): 
 160     for info_field
, expected 
in expected_dict
.items(): 
 161         got 
= got_dict
.get(info_field
) 
 162         expect_value(self
, got
, expected
, info_field
) 
 165 def expect_info_dict(self
, got_dict
, expected_dict
): 
 166     expect_dict(self
, got_dict
, expected_dict
) 
 167     # Check for the presence of mandatory fields 
 168     if got_dict
.get('_type') not in ('playlist', 'multi_video'): 
 169         for key 
in ('id', 'url', 'title', 'ext'): 
 170             self
.assertTrue(got_dict
.get(key
), 'Missing mandatory field %s' % key
) 
 171     # Check for mandatory fields that are automatically set by YoutubeDL 
 172     for key 
in ['webpage_url', 'extractor', 'extractor_key']: 
 173         self
.assertTrue(got_dict
.get(key
), 'Missing field: %s' % key
) 
 175     # Are checkable fields missing from the test case definition? 
 176     test_info_dict 
= dict((key
, value 
if not isinstance(value
, compat_str
) or len(value
) < 250 else 'md5:' + md5(value
)) 
 177                           for key
, value 
in got_dict
.items() 
 178                           if value 
and key 
in ('id', 'title', 'description', 'uploader', 'upload_date', 'timestamp', 'uploader_id', 'location', 'age_limit')) 
 179     missing_keys 
= set(test_info_dict
.keys()) - set(expected_dict
.keys()) 
 182             if isinstance(v
, compat_str
): 
 183                 return "'%s'" % v
.replace('\\', '\\\\').replace("'", "\\'").replace('\n', '\\n') 
 187         if len(missing_keys
) != len(expected_dict
): 
 188             info_dict_str 
+= ''.join( 
 189                 '    %s: %s,\n' % (_repr(k
), _repr(v
)) 
 190                 for k
, v 
in test_info_dict
.items() if k 
not in missing_keys
) 
 193                 info_dict_str 
+= '\n' 
 194         info_dict_str 
+= ''.join( 
 195             '    %s: %s,\n' % (_repr(k
), _repr(test_info_dict
[k
])) 
 196             for k 
in missing_keys
) 
 198             '\n\'info_dict\': {\n' + info_dict_str 
+ '},\n', out
=sys
.stderr
) 
 201             'Missing keys in test definition: %s' % ( 
 202                 ', '.join(sorted(missing_keys
)))) 
 205 def assertRegexpMatches(self
, text
, regexp
, msg
=None): 
 206     if hasattr(self
, 'assertRegexp'): 
 207         return self
.assertRegexp(text
, regexp
, msg
) 
 209         m 
= re
.match(regexp
, text
) 
 211             note 
= 'Regexp didn\'t match: %r not found' % (regexp
) 
 213                 note 
+= ' in %r' % text
 
 217                 msg 
= note 
+ ', ' + msg
 
 218             self
.assertTrue(m
, msg
) 
 221 def assertGreaterEqual(self
, got
, expected
, msg
=None): 
 222     if not (got 
>= expected
): 
 224             msg 
= '%r not greater than or equal to %r' % (got
, expected
) 
 225         self
.assertTrue(got 
>= expected
, msg
) 
 228 def expect_warnings(ydl
, warnings_re
): 
 229     real_warning 
= ydl
.report_warning
 
 231     def _report_warning(w
): 
 232         if not any(re
.search(w_re
, w
) for w_re 
in warnings_re
): 
 235     ydl
.report_warning 
= _report_warning