diff --git a/README.md b/README.md index 54c8d60..b95c22e 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 version - show available resolutions + or: delarte program_page_url version resolution - download the given video ``` 🔧 How it works diff --git a/src/delarte/__main__.py b/src/delarte/__main__.py index 8469a04..d104d00 100644 --- a/src/delarte/__main__.py +++ b/src/delarte/__main__.py @@ -17,6 +17,7 @@ from . import hls from . import muxing from . import naming from . import www +from . import cli def _fail(message, code=1): @@ -65,7 +66,9 @@ def create_progress(): def main(): """CLI command.""" - args = sys.argv[1:] + parser = cli.Parser() + args = parser.get_args_as_list() + if not args or args[0] == "-h" or args[0] == "--help": print(__doc__) return 0 diff --git a/src/delarte/cli.py b/src/delarte/cli.py new file mode 100644 index 0000000..2ab3bae --- /dev/null +++ b/src/delarte/cli.py @@ -0,0 +1,58 @@ +# 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 + + +class Parser(argparse.ArgumentParser): + """Parser responsible for parsing CLI arguments.""" + + def __init__(self): + """Generate a parser.""" + super().__init__( + description="downloads Arte's videos with subtitles", + epilog=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + self.add_argument( + "url", + help="url of Arte movie's webpage", + action="store", + type=str, + nargs="?", + ) + self.add_argument( + "version", + help="one of the language code proposed by Arte", + action="store", + type=str, + nargs="?", + ) + self.add_argument( + "resolution", + help="video resolution", + action="store", + type=str, + nargs="?", + ) + + def get_args_as_list(self): + """Get arguments from CLI as a list. + + Returns: + List: ordered list of arguments, None removed + """ + args_namespace = self.parse_args() + 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/__init__.py b/tests/__init__.py index e69de29..2d1850d 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -0,0 +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 new file mode 100644 index 0000000..c1c20b6 --- /dev/null +++ b/tests/tests_parser.py @@ -0,0 +1,62 @@ +# 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 + +import argparse + +from src.delarte.cli import Parser + + +class TestParser(TestCase): + """Tests for args parser.""" + + def setUp(self): + """Create a CLI Parser.""" + self.parser = Parser() + + 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( + [ + "https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", + "VOF-STMF", + "216p", + ], + ) + ) + self.assertEqual( + args, + { + "version": "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/", + version="VOF-STMF", + resolution="216p", + ), + ) + def test_get_args_as_list(self, *mock_args): + """Test the return method for listing arguments.""" + args = self.parser.get_args_as_list() + self.assertEqual( + args, + [ + "https://www.arte.tv/en/videos/104001-000-A/clint-eastwood/", + "VOF-STMF", + "216p", + ], + )