From 2a2d0dbdbbd7e1bb38f3061d886221fc83ee0b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Wed, 14 Dec 2022 09:14:28 +0100 Subject: [PATCH 01/11] =?UTF-8?q?=F0=9F=A9=B9=20use=20argparse=20library?= =?UTF-8?q?=20for=20parsing=20CLI=20arguments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/__main__.py | 7 ++++++- src/delarte/cli_parser.py | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/delarte/cli_parser.py diff --git a/src/delarte/__main__.py b/src/delarte/__main__.py index 66005c5..0c5b369 100644 --- a/src/delarte/__main__.py +++ b/src/delarte/__main__.py @@ -12,11 +12,14 @@ usage: delarte [-h|--help] - print this message import sys import time +from pprint import pprint + from . import api from . import hls from . import muxing from . import naming from . import www +from .cli_parser import create_parser, get_args_as_list def fail(message, code=1): @@ -68,7 +71,9 @@ def create_progress(): def main(): """CLI command.""" - args = sys.argv[1:] + parser = create_parser() + args = get_args_as_list(parser) + if not args or args[0] == "-h" or args[0] == "--help": print(__doc__) return 0 diff --git a/src/delarte/cli_parser.py b/src/delarte/cli_parser.py new file mode 100644 index 0000000..ee45458 --- /dev/null +++ b/src/delarte/cli_parser.py @@ -0,0 +1,42 @@ +import argparse + + +def create_parser() -> argparse.ArgumentParser: + """return a parser for the script arguments + + Returns: + argparse.ArgumentParser: argument parser object dedicated to get arguments from CLI call + """ + parser = argparse.ArgumentParser() + parser.add_argument( + "url", + help="url of Arte movie's webpage", + action="store", + type=str, + ) + parser.add_argument( + "-l", + "--languages", + help="one of the language code proposed by Arte", + required=False, + action="store", + type=str, + nargs="?", + ) + parser.add_argument( + "-r", + "--resolution", + help="directory where the output files will be stored", + required=False, + action="store", + type=str, + nargs="?", + ) + + return parser + + +def get_args_as_list(parser): + parser.parse_args() + args_namespace = parser.parse_args() + return [args_namespace.url, args_namespace.languages, args_namespace.resolution] From f00dfea85b7ba833a7fa076631cf21b68822484c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Wed, 14 Dec 2022 09:15:06 +0100 Subject: [PATCH 02/11] =?UTF-8?q?=E2=9C=85=20add=20tests=20for=20cli=20par?= =?UTF-8?q?ser=20behaviour?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/__main__.py | 2 -- tests/__init__.py | 0 tests/tests_cli_parser.py | 56 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/tests_cli_parser.py diff --git a/src/delarte/__main__.py b/src/delarte/__main__.py index 0c5b369..169ac37 100644 --- a/src/delarte/__main__.py +++ b/src/delarte/__main__.py @@ -12,8 +12,6 @@ usage: delarte [-h|--help] - print this message import sys import time -from pprint import pprint - from . import api from . import hls from . import muxing diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/tests_cli_parser.py b/tests/tests_cli_parser.py new file mode 100644 index 0000000..d0fac26 --- /dev/null +++ b/tests/tests_cli_parser.py @@ -0,0 +1,56 @@ +"""test for command-line args parser +""" + +from unittest import TestCase, mock + +import argparse + +from src.delarte.cli_parser import create_parser, get_args_as_list + + +class TestCliParser(TestCase): + def setUp(self): + self.parser = create_parser() + + def tearDown(self): + self.parser = None + + def test_args_parse(self): + args = vars( + self.parser.parse_args( + [ + "https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", + "-l", + "VOF-STMF", + "-r", + "216p", + ], + ) + ) + self.assertEqual( + args, + { + "languages": "VOF-STMF", + "resolution": "216p", + "url": "https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", + }, + ) + + @mock.patch( + "argparse.ArgumentParser.parse_args", + return_value=argparse.Namespace( + url="https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", + languages="VOF-STMF", + resolution="216p", + ), + ) + def test_get_args_as_list(self, *mock_args): + args = get_args_as_list(self.parser) + self.assertEqual( + args, + [ + "https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", + "VOF-STMF", + "216p", + ], + ) From 5b811be84b32aa27bd47d6c2e606bf5223005bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Wed, 14 Dec 2022 10:11:38 +0100 Subject: [PATCH 03/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20wrapped=20parser=20f?= =?UTF-8?q?unctions=20in=20a=20Parser=20object?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/__main__.py | 6 ++-- src/delarte/cli_parser.py | 73 ++++++++++++++++++++------------------- tests/__init__.py | 1 + tests/tests_cli_parser.py | 15 +++++--- 4 files changed, 51 insertions(+), 44 deletions(-) diff --git a/src/delarte/__main__.py b/src/delarte/__main__.py index 169ac37..d04206e 100644 --- a/src/delarte/__main__.py +++ b/src/delarte/__main__.py @@ -17,7 +17,7 @@ from . import hls from . import muxing from . import naming from . import www -from .cli_parser import create_parser, get_args_as_list +from .cli_parser import CLIParser def fail(message, code=1): @@ -69,8 +69,8 @@ def create_progress(): def main(): """CLI command.""" - parser = create_parser() - args = get_args_as_list(parser) + parser = CLIParser() + args = parser.get_args_as_list() if not args or args[0] == "-h" or args[0] == "--help": print(__doc__) diff --git a/src/delarte/cli_parser.py b/src/delarte/cli_parser.py index ee45458..86fd71d 100644 --- a/src/delarte/cli_parser.py +++ b/src/delarte/cli_parser.py @@ -1,42 +1,43 @@ +"""CLI arguments related module.""" import argparse -def create_parser() -> argparse.ArgumentParser: - """return a parser for the script arguments +class CLIParser(argparse.ArgumentParser): + """Parser responsible for parsing CLI arguments.""" - Returns: - argparse.ArgumentParser: argument parser object dedicated to get arguments from CLI call - """ - parser = argparse.ArgumentParser() - parser.add_argument( - "url", - help="url of Arte movie's webpage", - action="store", - type=str, - ) - parser.add_argument( - "-l", - "--languages", - help="one of the language code proposed by Arte", - required=False, - action="store", - type=str, - nargs="?", - ) - parser.add_argument( - "-r", - "--resolution", - help="directory where the output files will be stored", - required=False, - action="store", - type=str, - nargs="?", - ) + def __init__(self): + """Generate a parser.""" + super().__init__() + self.add_argument( + "url", + help="url of Arte movie's webpage", + action="store", + type=str, + ) + self.add_argument( + "-l", + "--languages", + help="one of the language code proposed by Arte", + required=False, + action="store", + type=str, + nargs="?", + ) + self.add_argument( + "-r", + "--resolution", + help="directory where the output files will be stored", + required=False, + action="store", + type=str, + nargs="?", + ) - return parser + def get_args_as_list(self): + """Get arguments from CLI as a list. - -def get_args_as_list(parser): - parser.parse_args() - args_namespace = parser.parse_args() - return [args_namespace.url, args_namespace.languages, args_namespace.resolution] + Returns: + List: liste ordonnée des arguments + """ + args_namespace = self.parse_args() + return [args_namespace.url, args_namespace.languages, args_namespace.resolution] diff --git a/tests/__init__.py b/tests/__init__.py index e69de29..38bb211 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Test package.""" diff --git a/tests/tests_cli_parser.py b/tests/tests_cli_parser.py index d0fac26..c9862d5 100644 --- a/tests/tests_cli_parser.py +++ b/tests/tests_cli_parser.py @@ -1,21 +1,25 @@ -"""test for command-line args parser -""" +"""Unit test for command-line args parser.""" from unittest import TestCase, mock import argparse -from src.delarte.cli_parser import create_parser, get_args_as_list +from src.delarte.cli_parser import CLIParser class TestCliParser(TestCase): + """Tests for args parser.""" + def setUp(self): - self.parser = create_parser() + """Create a CLI Parser.""" + self.parser = CLIParser() def tearDown(self): + """Delete the CLI Parser.""" self.parser = None def test_args_parse(self): + """Test this parser gets the arguments from CLI.""" args = vars( self.parser.parse_args( [ @@ -45,7 +49,8 @@ class TestCliParser(TestCase): ), ) def test_get_args_as_list(self, *mock_args): - args = get_args_as_list(self.parser) + """Test the return method for listing arguments.""" + args = self.parser.get_args_as_list() self.assertEqual( args, [ From 542460fab59bc91e092329231c5975e3890b72ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Wed, 14 Dec 2022 14:45:13 +0100 Subject: [PATCH 04/11] =?UTF-8?q?=F0=9F=9A=9A=20rename=20modules=20and=20c?= =?UTF-8?q?li=20parser=20Class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/__main__.py | 4 ++-- src/delarte/{cli_parser.py => cli.py} | 2 +- tests/{tests_cli_parser.py => tests_parser.py} | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename src/delarte/{cli_parser.py => cli.py} (96%) rename tests/{tests_cli_parser.py => tests_parser.py} (93%) diff --git a/src/delarte/__main__.py b/src/delarte/__main__.py index d04206e..5766293 100644 --- a/src/delarte/__main__.py +++ b/src/delarte/__main__.py @@ -17,7 +17,7 @@ from . import hls from . import muxing from . import naming from . import www -from .cli_parser import CLIParser +from . import cli def fail(message, code=1): @@ -69,7 +69,7 @@ def create_progress(): def main(): """CLI command.""" - parser = CLIParser() + parser = cli.Parser() args = parser.get_args_as_list() if not args or args[0] == "-h" or args[0] == "--help": diff --git a/src/delarte/cli_parser.py b/src/delarte/cli.py similarity index 96% rename from src/delarte/cli_parser.py rename to src/delarte/cli.py index 86fd71d..a9a418e 100644 --- a/src/delarte/cli_parser.py +++ b/src/delarte/cli.py @@ -2,7 +2,7 @@ import argparse -class CLIParser(argparse.ArgumentParser): +class Parser(argparse.ArgumentParser): """Parser responsible for parsing CLI arguments.""" def __init__(self): diff --git a/tests/tests_cli_parser.py b/tests/tests_parser.py similarity index 93% rename from tests/tests_cli_parser.py rename to tests/tests_parser.py index c9862d5..45f3a83 100644 --- a/tests/tests_cli_parser.py +++ b/tests/tests_parser.py @@ -4,15 +4,15 @@ from unittest import TestCase, mock import argparse -from src.delarte.cli_parser import CLIParser +from src.delarte.cli import Parser -class TestCliParser(TestCase): +class TestParser(TestCase): """Tests for args parser.""" def setUp(self): """Create a CLI Parser.""" - self.parser = CLIParser() + self.parser = Parser() def tearDown(self): """Delete the CLI Parser.""" From 9f06e1e761f375b740e5b5162e5db1075311b7dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Wed, 14 Dec 2022 15:04:13 +0100 Subject: [PATCH 05/11] =?UTF-8?q?=F0=9F=93=9D=20change=20readme=20doc=20on?= =?UTF-8?q?=20usage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f46e239..e9e451d 100644 --- a/README.md +++ b/README.md @@ -50,10 +50,10 @@ or $ delarte --help ArteTV dowloader. -usage: delarte [-h|--help] - print this message - or: delarte program_page_url - show available versions - or: delarte program_page_url version - show available resolutions - or: delarte program_page_url version resolution - download the given video +usage: delarte [-h|--help] - print this message + or: delarte program_page_url - show available versions + or: delarte program_page_url -l version - show available resolutions + or: delarte program_page_url -l version -r resolution - download the given video ``` 🔧 How it works From 3b220c634688f8f3ffddaf41594006738e82dc89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Wed, 14 Dec 2022 15:38:08 +0100 Subject: [PATCH 06/11] =?UTF-8?q?=F0=9F=9A=B8=20add=20documentation=20for?= =?UTF-8?q?=20user=20to=20arguments=20parser=20with=20-h=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/cli.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/delarte/cli.py b/src/delarte/cli.py index a9a418e..385d0ce 100644 --- a/src/delarte/cli.py +++ b/src/delarte/cli.py @@ -7,7 +7,16 @@ class Parser(argparse.ArgumentParser): def __init__(self): """Generate a parser.""" - super().__init__() + super().__init__( + description="downloads Arte's videos with subtitles", + epilog="examples:\n" + "\tdelarte -h\t\t\t\t\t-> shows this help\n" + "\tdelarte [url]\t\t\t\t\t-> shows available languages\n" + "\tdelarte [url] -l [language]\t\t\t-> shows available resolutions\n" + "\tdelarte [url] -l [language] -r [resolution]\t-> " + "downloads Arte's video\n", + formatter_class=argparse.RawTextHelpFormatter, + ) self.add_argument( "url", help="url of Arte movie's webpage", From 442df05ea455bf9cb0db80be17f591412bf5edda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Fri, 16 Dec 2022 01:22:50 +0100 Subject: [PATCH 07/11] :children_crossing: remove flags from script prototype :adhesive_bandage: naming: not "languages", "version" --- README.md | 8 ++++---- src/delarte/cli.py | 23 +++++++++-------------- tests/tests_parser.py | 6 ++---- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index e9e451d..2f74b10 100644 --- a/README.md +++ b/README.md @@ -50,10 +50,10 @@ or $ delarte --help ArteTV dowloader. -usage: delarte [-h|--help] - print this message - or: delarte program_page_url - show available versions - or: delarte program_page_url -l version - show available resolutions - or: delarte program_page_url -l version -r resolution - download the given video +usage: delarte [-h|--help] - print this message + or: delarte program_page_url - show available versions + or: delarte program_page_url version - show available resolutions + or: delarte program_page_url version resolution - download the given video ``` 🔧 How it works diff --git a/src/delarte/cli.py b/src/delarte/cli.py index 385d0ce..6db1060 100644 --- a/src/delarte/cli.py +++ b/src/delarte/cli.py @@ -9,34 +9,24 @@ class Parser(argparse.ArgumentParser): """Generate a parser.""" super().__init__( description="downloads Arte's videos with subtitles", - epilog="examples:\n" - "\tdelarte -h\t\t\t\t\t-> shows this help\n" - "\tdelarte [url]\t\t\t\t\t-> shows available languages\n" - "\tdelarte [url] -l [language]\t\t\t-> shows available resolutions\n" - "\tdelarte [url] -l [language] -r [resolution]\t-> " - "downloads Arte's video\n", - formatter_class=argparse.RawTextHelpFormatter, ) self.add_argument( "url", help="url of Arte movie's webpage", action="store", type=str, + nargs="?", ) self.add_argument( - "-l", - "--languages", + "version", help="one of the language code proposed by Arte", - required=False, action="store", type=str, nargs="?", ) self.add_argument( - "-r", - "--resolution", + "resolution", help="directory where the output files will be stored", - required=False, action="store", type=str, nargs="?", @@ -49,4 +39,9 @@ class Parser(argparse.ArgumentParser): List: liste ordonnée des arguments """ args_namespace = self.parse_args() - return [args_namespace.url, args_namespace.languages, args_namespace.resolution] + args_list = [ + args_namespace.url, + args_namespace.version, + args_namespace.resolution, + ] + return [arg for arg in args_list if arg is not None] diff --git a/tests/tests_parser.py b/tests/tests_parser.py index 45f3a83..682d994 100644 --- a/tests/tests_parser.py +++ b/tests/tests_parser.py @@ -24,9 +24,7 @@ class TestParser(TestCase): self.parser.parse_args( [ "https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", - "-l", "VOF-STMF", - "-r", "216p", ], ) @@ -34,7 +32,7 @@ class TestParser(TestCase): self.assertEqual( args, { - "languages": "VOF-STMF", + "version": "VOF-STMF", "resolution": "216p", "url": "https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", }, @@ -44,7 +42,7 @@ class TestParser(TestCase): "argparse.ArgumentParser.parse_args", return_value=argparse.Namespace( url="https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", - languages="VOF-STMF", + version="VOF-STMF", resolution="216p", ), ) From 03d45dfbbd65b24bf99cb897ecbda292df208f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Fri, 16 Dec 2022 10:24:51 +0100 Subject: [PATCH 08/11] =?UTF-8?q?=F0=9F=90=9B=20=F0=9F=92=A1=20fixed=20bad?= =?UTF-8?q?=20help=20sentence=20for=20resolution=20argument?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/delarte/cli.py b/src/delarte/cli.py index 6db1060..778d64f 100644 --- a/src/delarte/cli.py +++ b/src/delarte/cli.py @@ -26,7 +26,7 @@ class Parser(argparse.ArgumentParser): ) self.add_argument( "resolution", - help="directory where the output files will be stored", + help="video resolution", action="store", type=str, nargs="?", From 2cbe3f9632cf4411a479c3c78eae54831079f640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Fri, 16 Dec 2022 10:26:21 +0100 Subject: [PATCH 09/11] =?UTF-8?q?=F0=9F=92=A1=20french=20translating=20doc?= =?UTF-8?q?strings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/delarte/cli.py b/src/delarte/cli.py index 778d64f..3ed9820 100644 --- a/src/delarte/cli.py +++ b/src/delarte/cli.py @@ -36,7 +36,7 @@ class Parser(argparse.ArgumentParser): """Get arguments from CLI as a list. Returns: - List: liste ordonnée des arguments + List: ordered list of arguments, None removed """ args_namespace = self.parse_args() args_list = [ From 8dce72c01a1b528e8285e5e546ba4121a1ac15fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Fri, 16 Dec 2022 10:29:37 +0100 Subject: [PATCH 10/11] =?UTF-8?q?=F0=9F=93=84=20add=20licence=20comments?= =?UTF-8?q?=20top?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/cli.py | 4 +++- tests/__init__.py | 3 +++ tests/tests_parser.py | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/delarte/cli.py b/src/delarte/cli.py index 3ed9820..efe12c5 100644 --- a/src/delarte/cli.py +++ b/src/delarte/cli.py @@ -1,4 +1,6 @@ -"""CLI arguments related module.""" +# Licence: GNU AGPL v3: http://www.gnu.org/licenses/ +# This file is part of [`delarte`](https://git.afpy.org/fcode/delarte.git)"""CLI arguments related module.""" + import argparse diff --git a/tests/__init__.py b/tests/__init__.py index 38bb211..2d1850d 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1,4 @@ +# Licence: GNU AGPL v3: http://www.gnu.org/licenses/ +# This file is part of [`delarte`](https://git.afpy.org/fcode/delarte.git) + """Test package.""" diff --git a/tests/tests_parser.py b/tests/tests_parser.py index 682d994..c1c20b6 100644 --- a/tests/tests_parser.py +++ b/tests/tests_parser.py @@ -1,3 +1,6 @@ +# Licence: GNU AGPL v3: http://www.gnu.org/licenses/ +# This file is part of [`delarte`](https://git.afpy.org/fcode/delarte.git)"""CLI arguments related module.""" + """Unit test for command-line args parser.""" from unittest import TestCase, mock From 3ee080c88ffe1268aff4db2cbc04fcf6e7ce943f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20TAUVEL?= Date: Fri, 16 Dec 2022 10:42:16 +0100 Subject: [PATCH 11/11] =?UTF-8?q?=F0=9F=93=9D=20add=20more=20doc=20for=20C?= =?UTF-8?q?LI=20help=20string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/delarte/cli.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/delarte/cli.py b/src/delarte/cli.py index efe12c5..2ab3bae 100644 --- a/src/delarte/cli.py +++ b/src/delarte/cli.py @@ -1,6 +1,13 @@ # Licence: GNU AGPL v3: http://www.gnu.org/licenses/ # This file is part of [`delarte`](https://git.afpy.org/fcode/delarte.git)"""CLI arguments related module.""" +""" +usage: delarte [-h|--help] - print this message +or: delarte program_page_url - show available versions +or: delarte program_page_url version - show available video resolutions +or: delarte program_page_url version resolution - download the given video +""" + import argparse @@ -11,6 +18,8 @@ class Parser(argparse.ArgumentParser): """Generate a parser.""" super().__init__( description="downloads Arte's videos with subtitles", + epilog=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter, ) self.add_argument( "url",