]>
Raphaƫl G. Git Repositories - youtubedl/blob - test/helper.py
c416f388cbfe335678269b0226cc10708c49a850
   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_info_dict(self
, got_dict
, expected_dict
): 
  93     for info_field
, expected 
in expected_dict
.items(): 
  94         if isinstance(expected
, compat_str
) and expected
.startswith('re:'): 
  95             got 
= got_dict
.get(info_field
) 
  96             match_str 
= expected
[len('re:'):] 
  97             match_rex 
= re
.compile(match_str
) 
 100                 isinstance(got
, compat_str
), 
 101                 'Expected a %s object, but got %s for field %s' % ( 
 102                     compat_str
.__name
__, type(got
).__name
__, info_field
)) 
 104                 match_rex
.match(got
), 
 105                 'field %s (value: %r) should match %r' % (info_field
, got
, match_str
)) 
 106         elif isinstance(expected
, type): 
 107             got 
= got_dict
.get(info_field
) 
 108             self
.assertTrue(isinstance(got
, expected
), 
 109                             'Expected type %r for field %s, but got value %r of type %r' % (expected
, info_field
, got
, type(got
))) 
 111             if isinstance(expected
, compat_str
) and expected
.startswith('md5:'): 
 112                 got 
= 'md5:' + md5(got_dict
.get(info_field
)) 
 113             elif isinstance(expected
, compat_str
) and expected
.startswith('mincount:'): 
 114                 got 
= got_dict
.get(info_field
) 
 116                     isinstance(got
, list), 
 117                     'Expected field %s to be a list, but it is of type %s' % ( 
 118                         info_field
, type(got
).__name
__)) 
 119                 expected_num 
= int(expected
.partition(':')[2]) 
 121                     self
, len(got
), expected_num
, 
 122                     'Expected %d items in field %s, but only got %d' % ( 
 123                         expected_num
, info_field
, len(got
) 
 128                 got 
= got_dict
.get(info_field
) 
 129             self
.assertEqual(expected
, got
, 
 130                              'invalid value for field %s, expected %r, got %r' % (info_field
, expected
, got
)) 
 132     # Check for the presence of mandatory fields 
 133     if got_dict
.get('_type') != 'playlist': 
 134         for key 
in ('id', 'url', 'title', 'ext'): 
 135             self
.assertTrue(got_dict
.get(key
), 'Missing mandatory field %s' % key
) 
 136     # Check for mandatory fields that are automatically set by YoutubeDL 
 137     for key 
in ['webpage_url', 'extractor', 'extractor_key']: 
 138         self
.assertTrue(got_dict
.get(key
), 'Missing field: %s' % key
) 
 140     # Are checkable fields missing from the test case definition? 
 141     test_info_dict 
= dict((key
, value 
if not isinstance(value
, compat_str
) or len(value
) < 250 else 'md5:' + md5(value
)) 
 142                           for key
, value 
in got_dict
.items() 
 143                           if value 
and key 
in ('title', 'description', 'uploader', 'upload_date', 'timestamp', 'uploader_id', 'location')) 
 144     missing_keys 
= set(test_info_dict
.keys()) - set(expected_dict
.keys()) 
 147             if isinstance(v
, compat_str
): 
 148                 return "'%s'" % v
.replace('\\', '\\\\').replace("'", "\\'").replace('\n', '\\n') 
 151         info_dict_str 
= ''.join( 
 152             '    %s: %s,\n' % (_repr(k
), _repr(v
)) 
 153             for k
, v 
in test_info_dict
.items()) 
 155             '\n\'info_dict\': {\n' + info_dict_str 
+ '}\n', out
=sys
.stderr
) 
 158             'Missing keys in test definition: %s' % ( 
 159                 ', '.join(sorted(missing_keys
)))) 
 162 def assertRegexpMatches(self
, text
, regexp
, msg
=None): 
 163     if hasattr(self
, 'assertRegexp'): 
 164         return self
.assertRegexp(text
, regexp
, msg
) 
 166         m 
= re
.match(regexp
, text
) 
 168             note 
= 'Regexp didn\'t match: %r not found' % (regexp
) 
 170                 note 
+= ' in %r' % text
 
 174                 msg 
= note 
+ ', ' + msg
 
 175             self
.assertTrue(m
, msg
) 
 178 def assertGreaterEqual(self
, got
, expected
, msg
=None): 
 179     if not (got 
>= expected
): 
 181             msg 
= '%r not greater than or equal to %r' % (got
, expected
) 
 182         self
.assertTrue(got 
>= expected
, msg
) 
 185 def expect_warnings(ydl
, warnings_re
): 
 186     real_warning 
= ydl
.report_warning
 
 188     def _report_warning(w
): 
 189         if not any(re
.search(w_re
, w
) for w_re 
in warnings_re
): 
 192     ydl
.report_warning 
= _report_warning