]>
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
.compat 
import ( 
  18 from youtube_dl
.utils 
import ( 
  24 def get_params(override
=None): 
  25     PARAMETERS_FILE 
= os
.path
.join(os
.path
.dirname(os
.path
.abspath(__file__
)), 
  27     LOCAL_PARAMETERS_FILE 
= os
.path
.join(os
.path
.dirname(os
.path
.abspath(__file__
)), 
  28                                          "local_parameters.json") 
  29     with io
.open(PARAMETERS_FILE
, encoding
='utf-8') as pf
: 
  30         parameters 
= json
.load(pf
) 
  31     if os
.path
.exists(LOCAL_PARAMETERS_FILE
): 
  32         with io
.open(LOCAL_PARAMETERS_FILE
, encoding
='utf-8') as pf
: 
  33             parameters
.update(json
.load(pf
)) 
  35         parameters
.update(override
) 
  40     """ Remove a file if it exists """ 
  43     except OSError as ose
: 
  44         if ose
.errno 
!= errno
.ENOENT
: 
  48 def report_warning(message
): 
  50     Print the message to stderr, it will be prefixed with 'WARNING:' 
  51     If stderr is a tty file the 'WARNING:' will be colored 
  53     if sys
.stderr
.isatty() and compat_os_name 
!= 'nt': 
  54         _msg_header 
= '\033[0;33mWARNING:\033[0m' 
  56         _msg_header 
= 'WARNING:' 
  57     output 
= '%s %s\n' % (_msg_header
, message
) 
  58     if 'b' in getattr(sys
.stderr
, 'mode', '') or sys
.version_info
[0] < 3: 
  59         output 
= output
.encode(preferredencoding()) 
  60     sys
.stderr
.write(output
) 
  63 class FakeYDL(YoutubeDL
): 
  64     def __init__(self
, override
=None): 
  65         # Different instances of the downloader can't share the same dictionary 
  66         # some test set the "sublang" parameter, which would break the md5 checks. 
  67         params 
= get_params(override
=override
) 
  68         super(FakeYDL
, self
).__init
__(params
, auto_init
=False) 
  71     def to_screen(self
, s
, skip_eol
=None): 
  74     def trouble(self
, s
, tb
=None): 
  77     def download(self
, x
): 
  80     def expect_warning(self
, regex
): 
  81         # Silence an expected warning matching a regex 
  82         old_report_warning 
= self
.report_warning
 
  84         def report_warning(self
, message
): 
  85             if re
.match(regex
, message
): 
  87             old_report_warning(message
) 
  88         self
.report_warning 
= types
.MethodType(report_warning
, self
) 
  91 def gettestcases(include_onlymatching
=False): 
  92     for ie 
in youtube_dl
.extractor
.gen_extractors(): 
  93         for tc 
in ie
.get_testcases(include_onlymatching
): 
  97 md5 
= lambda s
: hashlib
.md5(s
.encode('utf-8')).hexdigest() 
 100 def expect_value(self
, got
, expected
, field
): 
 101     if isinstance(expected
, compat_str
) and expected
.startswith('re:'): 
 102         match_str 
= expected
[len('re:'):] 
 103         match_rex 
= re
.compile(match_str
) 
 106             isinstance(got
, compat_str
), 
 107             'Expected a %s object, but got %s for field %s' % ( 
 108                 compat_str
.__name
__, type(got
).__name
__, field
)) 
 110             match_rex
.match(got
), 
 111             'field %s (value: %r) should match %r' % (field
, got
, match_str
)) 
 112     elif isinstance(expected
, compat_str
) and expected
.startswith('startswith:'): 
 113         start_str 
= expected
[len('startswith:'):] 
 115             isinstance(got
, compat_str
), 
 116             'Expected a %s object, but got %s for field %s' % ( 
 117                 compat_str
.__name
__, type(got
).__name
__, field
)) 
 119             got
.startswith(start_str
), 
 120             'field %s (value: %r) should start with %r' % (field
, got
, start_str
)) 
 121     elif isinstance(expected
, compat_str
) and expected
.startswith('contains:'): 
 122         contains_str 
= expected
[len('contains:'):] 
 124             isinstance(got
, compat_str
), 
 125             'Expected a %s object, but got %s for field %s' % ( 
 126                 compat_str
.__name
__, type(got
).__name
__, field
)) 
 129             'field %s (value: %r) should contain %r' % (field
, got
, contains_str
)) 
 130     elif isinstance(expected
, type): 
 132             isinstance(got
, expected
), 
 133             'Expected type %r for field %s, but got value %r of type %r' % (expected
, field
, got
, type(got
))) 
 134     elif isinstance(expected
, dict) and isinstance(got
, dict): 
 135         expect_dict(self
, got
, expected
) 
 136     elif isinstance(expected
, list) and isinstance(got
, list): 
 138             len(expected
), len(got
), 
 139             'Expect a list of length %d, but got a list of length %d for field %s' % ( 
 140                 len(expected
), len(got
), field
)) 
 141         for index
, (item_got
, item_expected
) in enumerate(zip(got
, expected
)): 
 142             type_got 
= type(item_got
) 
 143             type_expected 
= type(item_expected
) 
 145                 type_expected
, type_got
, 
 146                 'Type mismatch for list item at index %d for field %s, expected %r, got %r' % ( 
 147                     index
, field
, type_expected
, type_got
)) 
 148             expect_value(self
, item_got
, item_expected
, field
) 
 150         if isinstance(expected
, compat_str
) and expected
.startswith('md5:'): 
 152                 isinstance(got
, compat_str
), 
 153                 'Expected field %s to be a unicode object, but got value %r of type %r' % (field
, got
, type(got
))) 
 154             got 
= 'md5:' + md5(got
) 
 155         elif isinstance(expected
, compat_str
) and expected
.startswith('mincount:'): 
 157                 isinstance(got
, (list, dict)), 
 158                 'Expected field %s to be a list or a dict, but it is of type %s' % ( 
 159                     field
, type(got
).__name
__)) 
 160             expected_num 
= int(expected
.partition(':')[2]) 
 162                 self
, len(got
), expected_num
, 
 163                 'Expected %d items in field %s, but only got %d' % (expected_num
, field
, len(got
))) 
 167             'Invalid value for field %s, expected %r, got %r' % (field
, expected
, got
)) 
 170 def expect_dict(self
, got_dict
, expected_dict
): 
 171     for info_field
, expected 
in expected_dict
.items(): 
 172         got 
= got_dict
.get(info_field
) 
 173         expect_value(self
, got
, expected
, info_field
) 
 176 def expect_info_dict(self
, got_dict
, expected_dict
): 
 177     expect_dict(self
, got_dict
, expected_dict
) 
 178     # Check for the presence of mandatory fields 
 179     if got_dict
.get('_type') not in ('playlist', 'multi_video'): 
 180         for key 
in ('id', 'url', 'title', 'ext'): 
 181             self
.assertTrue(got_dict
.get(key
), 'Missing mandatory field %s' % key
) 
 182     # Check for mandatory fields that are automatically set by YoutubeDL 
 183     for key 
in ['webpage_url', 'extractor', 'extractor_key']: 
 184         self
.assertTrue(got_dict
.get(key
), 'Missing field: %s' % key
) 
 186     # Are checkable fields missing from the test case definition? 
 187     test_info_dict 
= dict((key
, value 
if not isinstance(value
, compat_str
) or len(value
) < 250 else 'md5:' + md5(value
)) 
 188                           for key
, value 
in got_dict
.items() 
 189                           if value 
and key 
in ('id', 'title', 'description', 'uploader', 'upload_date', 'timestamp', 'uploader_id', 'location', 'age_limit')) 
 190     missing_keys 
= set(test_info_dict
.keys()) - set(expected_dict
.keys()) 
 193             if isinstance(v
, compat_str
): 
 194                 return "'%s'" % v
.replace('\\', '\\\\').replace("'", "\\'").replace('\n', '\\n') 
 198         if len(missing_keys
) != len(expected_dict
): 
 199             info_dict_str 
+= ''.join( 
 200                 '    %s: %s,\n' % (_repr(k
), _repr(v
)) 
 201                 for k
, v 
in test_info_dict
.items() if k 
not in missing_keys
) 
 204                 info_dict_str 
+= '\n' 
 205         info_dict_str 
+= ''.join( 
 206             '    %s: %s,\n' % (_repr(k
), _repr(test_info_dict
[k
])) 
 207             for k 
in missing_keys
) 
 209             '\n\'info_dict\': {\n' + info_dict_str 
+ '},\n', out
=sys
.stderr
) 
 212             'Missing keys in test definition: %s' % ( 
 213                 ', '.join(sorted(missing_keys
)))) 
 216 def assertRegexpMatches(self
, text
, regexp
, msg
=None): 
 217     if hasattr(self
, 'assertRegexp'): 
 218         return self
.assertRegexp(text
, regexp
, msg
) 
 220         m 
= re
.match(regexp
, text
) 
 222             note 
= 'Regexp didn\'t match: %r not found' % (regexp
) 
 224                 note 
+= ' in %r' % text
 
 228                 msg 
= note 
+ ', ' + msg
 
 229             self
.assertTrue(m
, msg
) 
 232 def assertGreaterEqual(self
, got
, expected
, msg
=None): 
 233     if not (got 
>= expected
): 
 235             msg 
= '%r not greater than or equal to %r' % (got
, expected
) 
 236         self
.assertTrue(got 
>= expected
, msg
) 
 239 def expect_warnings(ydl
, warnings_re
): 
 240     real_warning 
= ydl
.report_warning
 
 242     def _report_warning(w
): 
 243         if not any(re
.search(w_re
, w
) for w_re 
in warnings_re
): 
 246     ydl
.report_warning 
= _report_warning