]>
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         t 
= getattr(ie
, '_TEST', None) 
  87             assert not hasattr(ie
, '_TESTS'), \
 
  88                 '%s has _TEST and _TESTS' % type(ie
).__name
__ 
  91             tests 
= getattr(ie
, '_TESTS', []) 
  93             if not include_onlymatching 
and t
.get('only_matching', False): 
  95             t
['name'] = type(ie
).__name
__[:-len('IE')] 
  99 md5 
= lambda s
: hashlib
.md5(s
.encode('utf-8')).hexdigest() 
 102 def expect_info_dict(self
, expected_dict
, got_dict
): 
 103     for info_field
, expected 
in expected_dict
.items(): 
 104         if isinstance(expected
, compat_str
) and expected
.startswith('re:'): 
 105             got 
= got_dict
.get(info_field
) 
 106             match_str 
= expected
[len('re:'):] 
 107             match_rex 
= re
.compile(match_str
) 
 110                 isinstance(got
, compat_str
), 
 111                 'Expected a %s object, but got %s for field %s' % ( 
 112                     compat_str
.__name
__, type(got
).__name
__, info_field
)) 
 114                 match_rex
.match(got
), 
 115                 'field %s (value: %r) should match %r' % (info_field
, got
, match_str
)) 
 116         elif isinstance(expected
, type): 
 117             got 
= got_dict
.get(info_field
) 
 118             self
.assertTrue(isinstance(got
, expected
), 
 119                             'Expected type %r for field %s, but got value %r of type %r' % (expected
, info_field
, got
, type(got
))) 
 121             if isinstance(expected
, compat_str
) and expected
.startswith('md5:'): 
 122                 got 
= 'md5:' + md5(got_dict
.get(info_field
)) 
 124                 got 
= got_dict
.get(info_field
) 
 125             self
.assertEqual(expected
, got
, 
 126                              'invalid value for field %s, expected %r, got %r' % (info_field
, expected
, got
)) 
 128     # Check for the presence of mandatory fields 
 129     if got_dict
.get('_type') != 'playlist': 
 130         for key 
in ('id', 'url', 'title', 'ext'): 
 131             self
.assertTrue(got_dict
.get(key
), 'Missing mandatory field %s' % key
) 
 132     # Check for mandatory fields that are automatically set by YoutubeDL 
 133     for key 
in ['webpage_url', 'extractor', 'extractor_key']: 
 134         self
.assertTrue(got_dict
.get(key
), 'Missing field: %s' % key
) 
 136     # Are checkable fields missing from the test case definition? 
 137     test_info_dict 
= dict((key
, value 
if not isinstance(value
, compat_str
) or len(value
) < 250 else 'md5:' + md5(value
)) 
 138                           for key
, value 
in got_dict
.items() 
 139                           if value 
and key 
in ('title', 'description', 'uploader', 'upload_date', 'timestamp', 'uploader_id', 'location')) 
 140     missing_keys 
= set(test_info_dict
.keys()) - set(expected_dict
.keys()) 
 143             if isinstance(v
, compat_str
): 
 144                 return "'%s'" % v
.replace('\\', '\\\\').replace("'", "\\'").replace('\n', '\\n') 
 147         info_dict_str 
= ''.join( 
 148             '    %s: %s,\n' % (_repr(k
), _repr(v
)) 
 149             for k
, v 
in test_info_dict
.items()) 
 151             '\n\'info_dict\': {\n' + info_dict_str 
+ '}\n', out
=sys
.stderr
) 
 154             'Missing keys in test definition: %s' % ( 
 155                 ', '.join(sorted(missing_keys
)))) 
 158 def assertRegexpMatches(self
, text
, regexp
, msg
=None): 
 159     if hasattr(self
, 'assertRegexp'): 
 160         return self
.assertRegexp(text
, regexp
, msg
) 
 162         m 
= re
.match(regexp
, text
) 
 164             note 
= 'Regexp didn\'t match: %r not found in %r' % (regexp
, text
) 
 168                 msg 
= note 
+ ', ' + msg
 
 169             self
.assertTrue(m
, msg
) 
 172 def assertGreaterEqual(self
, got
, expected
, msg
=None): 
 173     if not (got 
>= expected
): 
 175             msg 
= '%r not greater than or equal to %r' % (got
, expected
) 
 176         self
.assertTrue(got 
>= expected
, msg
) 
 179 def expect_warnings(ydl
, warnings_re
): 
 180     real_warning 
= ydl
.report_warning
 
 182     def _report_warning(w
): 
 183         if not any(re
.search(w_re
, w
) for w_re 
in warnings_re
): 
 186     ydl
.report_warning 
= _report_warning