From f6152b4b64c1be14d94f65c71382cdb8cd6c6a47 Mon Sep 17 00:00:00 2001 From: gcmalloc Date: Tue, 11 Dec 2012 19:17:02 +0100 Subject: [PATCH 1/2] changing the template file extension --- Makefile | 2 +- devscripts/{bash-completion.template => bash-completion.in} | 0 devscripts/bash-completion.py | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename devscripts/{bash-completion.template => bash-completion.in} (100%) diff --git a/Makefile b/Makefile index c97d6ffb0..5073a211b 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ README.txt: README.md youtube-dl.1: README.md pandoc -s -f markdown -t man README.md -o youtube-dl.1 -youtube-dl.bash-completion: youtube_dl/*.py devscripts/bash-completion.template +youtube-dl.bash-completion: youtube_dl/*.py devscripts/bash-completion.in python devscripts/bash-completion.py youtube-dl.tar.gz: all diff --git a/devscripts/bash-completion.template b/devscripts/bash-completion.in similarity index 100% rename from devscripts/bash-completion.template rename to devscripts/bash-completion.in diff --git a/devscripts/bash-completion.py b/devscripts/bash-completion.py index 880db7886..49287724d 100644 --- a/devscripts/bash-completion.py +++ b/devscripts/bash-completion.py @@ -7,7 +7,7 @@ sys.path.append(dirn(dirn((os.path.abspath(__file__))))) import youtube_dl BASH_COMPLETION_FILE = "youtube-dl.bash-completion" -BASH_COMPLETION_TEMPLATE = "devscripts/bash-completion.template" +BASH_COMPLETION_TEMPLATE = "devscripts/bash-completion.in" def build_completion(opt_parser): opts_flag = [] From 1535ac2ae930104b67939a628411d3f5ab023571 Mon Sep 17 00:00:00 2001 From: gcmalloc Date: Wed, 12 Dec 2012 03:55:06 +0100 Subject: [PATCH 2/2] test automation --- test/gentests.py | 132 ---------------------- test/test_download.py | 251 +++++++++++------------------------------- test/tests.json | 4 +- 3 files changed, 65 insertions(+), 322 deletions(-) delete mode 100755 test/gentests.py diff --git a/test/gentests.py b/test/gentests.py deleted file mode 100755 index 0ea5d9f21..000000000 --- a/test/gentests.py +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python3 - -import io # for python 2 -import json -import os -import sys -import unittest - -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -import youtube_dl.InfoExtractors - -HEADER = u'''#!/usr/bin/env python - -# DO NOT EDIT THIS FILE BY HAND! -# It is auto-generated from tests.json and gentests.py. - -import hashlib -import io -import os -import json -import unittest -import sys -import socket - -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -import youtube_dl.FileDownloader -import youtube_dl.InfoExtractors -from youtube_dl.utils import * - -# General configuration (from __init__, not very elegant...) -jar = compat_cookiejar.CookieJar() -cookie_processor = compat_urllib_request.HTTPCookieProcessor(jar) -proxy_handler = compat_urllib_request.ProxyHandler() -opener = compat_urllib_request.build_opener(proxy_handler, cookie_processor, YoutubeDLHandler()) -compat_urllib_request.install_opener(opener) -socket.setdefaulttimeout(300) # 5 minutes should be enough (famous last words) - -class FileDownloader(youtube_dl.FileDownloader): - def __init__(self, *args, **kwargs): - youtube_dl.FileDownloader.__init__(self, *args, **kwargs) - self.to_stderr = self.to_screen - -def _file_md5(fn): - with open(fn, 'rb') as f: - return hashlib.md5(f.read()).hexdigest() -try: - _skip_unless = unittest.skipUnless -except AttributeError: # Python 2.6 - def _skip_unless(cond, reason='No reason given'): - def resfunc(f): - # Start the function name with test to appease nosetests-2.6 - def test_wfunc(*args, **kwargs): - if cond: - return f(*args, **kwargs) - else: - print('Skipped test') - return - return test_wfunc - return resfunc -_skip = lambda *args, **kwargs: _skip_unless(False, *args, **kwargs) - -class DownloadTest(unittest.TestCase): - PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "parameters.json") - - def setUp(self): - # Clear old files - self.tearDown() - - with io.open(self.PARAMETERS_FILE, encoding='utf-8') as pf: - self.parameters = json.load(pf) -''' - -FOOTER = u''' - -if __name__ == '__main__': - unittest.main() -''' - -DEF_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tests.json') -TEST_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_download.py') - -def gentests(): - with io.open(DEF_FILE, encoding='utf-8') as deff: - defs = json.load(deff) - with io.open(TEST_FILE, 'w', encoding='utf-8') as testf: - testf.write(HEADER) - spaces = ' ' * 4 - write = lambda l: testf.write(spaces + l + u'\n') - - for d in defs: - name = d['name'] - ie = getattr(youtube_dl.InfoExtractors, name + 'IE') - testf.write(u'\n') - write('@_skip_unless(youtube_dl.InfoExtractors.' + name + 'IE._WORKING, "IE marked as not _WORKING")') - if not d['file']: - write('@_skip("No output file specified")') - elif 'skip' in d: - write('@_skip(' + repr(d['skip']) + ')') - write('def test_' + name + '(self):') - write(' filename = ' + repr(d['file'])) - write(' params = self.parameters') - for p in d.get('params', {}): - write(' params["' + p + '"] = ' + repr(d['params'][p])) - write(' fd = FileDownloader(params)') - write(' fd.add_info_extractor(youtube_dl.InfoExtractors.' + name + 'IE())') - for ien in d.get('addIEs', []): - write(' fd.add_info_extractor(youtube_dl.InfoExtractors.' + ien + 'IE())') - write(' fd.download([' + repr(d['url']) + '])') - write(' self.assertTrue(os.path.exists(filename))') - if 'md5' in d: - write(' md5_for_file = _file_md5(filename)') - write(' self.assertEqual(md5_for_file, ' + repr(d['md5']) + ')') - - testf.write(u'\n\n') - write('def tearDown(self):') - for d in defs: - if d['file']: - write(' if os.path.exists(' + repr(d['file']) + '):') - write(' os.remove(' + repr(d['file']) + ')') - else: - write(' # No file specified for ' + d['name']) - testf.write(u'\n') - testf.write(FOOTER) - -if __name__ == '__main__': - gentests() diff --git a/test/test_download.py b/test/test_download.py index f45c500c8..be15fb5ab 100644 --- a/test/test_download.py +++ b/test/test_download.py @@ -1,197 +1,72 @@ -#!/usr/bin/env python - -# DO NOT EDIT THIS FILE BY HAND! -# It is auto-generated from tests.json and gentests.py. - +#!/usr/bin/env python2 import hashlib -import io import os import json import unittest import sys -import socket - -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -import youtube_dl.FileDownloader -import youtube_dl.InfoExtractors -from youtube_dl.utils import * - -# General configuration (from __init__, not very elegant...) -jar = compat_cookiejar.CookieJar() -cookie_processor = compat_urllib_request.HTTPCookieProcessor(jar) -proxy_handler = compat_urllib_request.ProxyHandler() -opener = compat_urllib_request.build_opener(proxy_handler, cookie_processor, YoutubeDLHandler()) -compat_urllib_request.install_opener(opener) -socket.setdefaulttimeout(300) # 5 minutes should be enough (famous last words) - -class FileDownloader(youtube_dl.FileDownloader): - def __init__(self, *args, **kwargs): - youtube_dl.FileDownloader.__init__(self, *args, **kwargs) - self.to_stderr = self.to_screen - -def _file_md5(fn): - with open(fn, 'rb') as f: - return hashlib.md5(f.read()).hexdigest() -try: - _skip_unless = unittest.skipUnless -except AttributeError: # Python 2.6 - def _skip_unless(cond, reason='No reason given'): - def resfunc(f): - # Start the function name with test to appease nosetests-2.6 - def test_wfunc(*args, **kwargs): - if cond: - return f(*args, **kwargs) - else: - print('Skipped test') - return - return test_wfunc - return resfunc -_skip = lambda *args, **kwargs: _skip_unless(False, *args, **kwargs) - -class DownloadTest(unittest.TestCase): - PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "parameters.json") - - def setUp(self): - # Clear old files - self.tearDown() - - with io.open(self.PARAMETERS_FILE, encoding='utf-8') as pf: - self.parameters = json.load(pf) - - @_skip_unless(youtube_dl.InfoExtractors.YoutubeIE._WORKING, "IE marked as not _WORKING") - def test_Youtube(self): - filename = u'BaW_jenozKc.mp4' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.YoutubeIE()) - fd.download([u'http://www.youtube.com/watch?v=BaW_jenozKc']) - self.assertTrue(os.path.exists(filename)) - - @_skip_unless(youtube_dl.InfoExtractors.DailymotionIE._WORKING, "IE marked as not _WORKING") - def test_Dailymotion(self): - filename = u'x33vw9.mp4' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.DailymotionIE()) - fd.download([u'http://www.dailymotion.com/video/x33vw9_tutoriel-de-youtubeur-dl-des-video_tech']) - self.assertTrue(os.path.exists(filename)) - md5_for_file = _file_md5(filename) - self.assertEqual(md5_for_file, u'392c4b85a60a90dc4792da41ce3144eb') - - @_skip_unless(youtube_dl.InfoExtractors.MetacafeIE._WORKING, "IE marked as not _WORKING") - def test_Metacafe(self): - filename = u'_aUehQsCQtM.flv' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.MetacafeIE()) - fd.add_info_extractor(youtube_dl.InfoExtractors.YoutubeIE()) - fd.download([u'http://www.metacafe.com/watch/yt-_aUehQsCQtM/the_electric_company_short_i_pbs_kids_go/']) - self.assertTrue(os.path.exists(filename)) - - @_skip_unless(youtube_dl.InfoExtractors.BlipTVIE._WORKING, "IE marked as not _WORKING") - def test_BlipTV(self): - filename = u'5779306.m4v' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.BlipTVIE()) - fd.download([u'http://blip.tv/cbr/cbr-exclusive-gotham-city-imposters-bats-vs-jokerz-short-3-5796352']) - self.assertTrue(os.path.exists(filename)) - md5_for_file = _file_md5(filename) - self.assertEqual(md5_for_file, u'b2d849efcf7ee18917e4b4d9ff37cafe') - - @_skip_unless(youtube_dl.InfoExtractors.XVideosIE._WORKING, "IE marked as not _WORKING") - def test_XVideos(self): - filename = u'939581.flv' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.XVideosIE()) - fd.download([u'http://www.xvideos.com/video939581/funny_porns_by_s_-1']) - self.assertTrue(os.path.exists(filename)) - md5_for_file = _file_md5(filename) - self.assertEqual(md5_for_file, u'1d0c835822f0a71a7bf011855db929d0') - - @_skip_unless(youtube_dl.InfoExtractors.VimeoIE._WORKING, "IE marked as not _WORKING") - def test_Vimeo(self): - filename = u'14160053.mp4' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.VimeoIE()) - fd.download([u'http://vimeo.com/14160053']) - self.assertTrue(os.path.exists(filename)) - md5_for_file = _file_md5(filename) - self.assertEqual(md5_for_file, u'60540a4ec7cc378ec84b919c0aed5023') - - @_skip_unless(youtube_dl.InfoExtractors.SoundcloudIE._WORKING, "IE marked as not _WORKING") - def test_Soundcloud(self): - filename = u'62986583.mp3' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.SoundcloudIE()) - fd.download([u'http://soundcloud.com/ethmusic/lostin-powers-she-so-heavy']) - self.assertTrue(os.path.exists(filename)) - md5_for_file = _file_md5(filename) - self.assertEqual(md5_for_file, u'ebef0a451b909710ed1d7787dddbf0d7') - - @_skip_unless(youtube_dl.InfoExtractors.StanfordOpenClassroomIE._WORKING, "IE marked as not _WORKING") - def test_StanfordOpenClassroom(self): - filename = u'PracticalUnix_intro-environment.mp4' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.StanfordOpenClassroomIE()) - fd.download([u'http://openclassroom.stanford.edu/MainFolder/VideoPage.php?course=PracticalUnix&video=intro-environment&speed=100']) - self.assertTrue(os.path.exists(filename)) - md5_for_file = _file_md5(filename) - self.assertEqual(md5_for_file, u'544a9468546059d4e80d76265b0443b8') - - @_skip_unless(youtube_dl.InfoExtractors.XNXXIE._WORKING, "IE marked as not _WORKING") - def test_XNXX(self): - filename = u'1135332.flv' - params = self.parameters - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.XNXXIE()) - fd.download([u'http://video.xnxx.com/video1135332/lida_naked_funny_actress_5_']) - self.assertTrue(os.path.exists(filename)) - md5_for_file = _file_md5(filename) - self.assertEqual(md5_for_file, u'0831677e2b4761795f68d417e0b7b445') - - @_skip_unless(youtube_dl.InfoExtractors.YoukuIE._WORKING, "IE marked as not _WORKING") - def test_Youku(self): - filename = u'XNDgyMDQ2NTQw_part00.flv' - params = self.parameters - params["test"] = False - fd = FileDownloader(params) - fd.add_info_extractor(youtube_dl.InfoExtractors.YoukuIE()) - fd.download([u'http://v.youku.com/v_show/id_XNDgyMDQ2NTQw.html']) - self.assertTrue(os.path.exists(filename)) - md5_for_file = _file_md5(filename) - self.assertEqual(md5_for_file, u'ffe3f2e435663dc2d1eea34faeff5b5b') - - - def tearDown(self): - if os.path.exists(u'BaW_jenozKc.mp4'): - os.remove(u'BaW_jenozKc.mp4') - if os.path.exists(u'x33vw9.mp4'): - os.remove(u'x33vw9.mp4') - if os.path.exists(u'_aUehQsCQtM.flv'): - os.remove(u'_aUehQsCQtM.flv') - if os.path.exists(u'5779306.m4v'): - os.remove(u'5779306.m4v') - if os.path.exists(u'939581.flv'): - os.remove(u'939581.flv') - if os.path.exists(u'14160053.mp4'): - os.remove(u'14160053.mp4') - if os.path.exists(u'62986583.mp3'): - os.remove(u'62986583.mp3') - if os.path.exists(u'PracticalUnix_intro-environment.mp4'): - os.remove(u'PracticalUnix_intro-environment.mp4') - if os.path.exists(u'1135332.flv'): - os.remove(u'1135332.flv') - if os.path.exists(u'XNDgyMDQ2NTQw_part00.flv'): - os.remove(u'XNDgyMDQ2NTQw_part00.flv') +from youtube_dl.FileDownloader import FileDownloader +#import all the info extractor +import youtube_dl + +DEF_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tests.json') +PARAM_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'parameters.json' +) + + +class TestDownload(unittest.TestCase): + pass + + +def md5_for_file(filename, block_size=2**20): + with open(filename) as f: + md5 = hashlib.md5() + while True: + data = f.read(block_size) + if not data: + break + md5.update(data) + return md5.hexdigest() + + +def generator(name, url, md5, file, ie_param, optional_ie): + def test_template(self): + fd = FileDownloader(ie_param) + fd.add_info_extractor(getattr(youtube_dl, name + "IE")()) + fd.download([url]) + self.assertTrue(os.path.exists(file)) + self.assertEqual(md5_for_file(file), md5) + return test_template + #only python 2.7 + +def clean_generator(files): + def clean_template(self): + for file_name in files: + if os.path.exists(file_name): + os.remove(file_name) + return clean_template + +with open(DEF_FILE, "r") as f: + with open(PARAM_FILE) as fp: + p = json.load(fp) + test_param = json.load(f) + files = set() + for test_case in test_param: + if test_case.get("broken", False): + continue + try: + files.add(test_case["file"]) + test_method = generator(test_case['name'], test_case['url'], test_case['md5'], test_case['file'], p, test_case.get('add_ie', [])) + test_method.__name__ = "test_{0}".format(test_case["name"]) + setattr(TestDownload, test_method.__name__, test_method) + del test_method + except KeyError as e: + sys.stderr.write("Issue with the parameters of test {0}.\n".format(test_case.get("name", "unknown test"))) + #clean the files + ff = clean_generator(files) + ff.__name__ = "tearDown" + setattr(TestDownload, ff.__name__, ff) + del ff if __name__ == '__main__': diff --git a/test/tests.json b/test/tests.json index 34992a321..40bb0d4f2 100644 --- a/test/tests.json +++ b/test/tests.json @@ -12,7 +12,7 @@ }, { "name": "Metacafe", - "addIEs": ["Youtube"], + "add_ie": ["Youtube"], "url": "http://www.metacafe.com/watch/yt-_aUehQsCQtM/the_electric_company_short_i_pbs_kids_go/", "file": "_aUehQsCQtM.flv" }, @@ -57,6 +57,6 @@ "url": "http://v.youku.com/v_show/id_XNDgyMDQ2NTQw.html", "file": "XNDgyMDQ2NTQw_part00.flv", "md5": "ffe3f2e435663dc2d1eea34faeff5b5b", - "params": { "test": false } + "broken": true } ]