Coverage for src/archive_md_urls/cli.py: 65%
31 statements
« prev ^ index » next coverage.py v6.4.2, created at 2022-07-28 16:50 +0200
« prev ^ index » next coverage.py v6.4.2, created at 2022-07-28 16:50 +0200
1"""Command line interface."""
3import argparse
4import asyncio
5import sys
6from pathlib import Path
8from archive_md_urls.update_files import update_files
11def get_md_files(items: list[Path], recursive: bool) -> list[Path]:
12 """Scan files and directories and create a list of Markdown files.
14 For single file just check if file exists and has the correct file ending (.md).
15 For directory, glob for files with .md ending and add each to file list.
17 Args:
18 item_list (list[str]): List of items provided via argparse
19 recursive (bool): Recursively search subdirectories for Markdown files if True
21 Returns:
22 list[Path]: List of Markdown files to update
23 """
24 files: list[Path] = []
25 for item in items:
26 if item.is_dir():
27 if recursive:
28 files.extend(
29 list(item.rglob("**/*.md"))
30 )
31 else:
32 files.extend(
33 list(item.glob("*.md"))
34 )
35 elif item.is_file():
36 if item.suffix == ".md":
37 files.append(item)
38 else:
39 sys.exit(f"No Markdown file extension (.md): {item}")
40 else:
41 sys.exit(f"Not a file or directory: {item}.")
42 if not files:
43 sys.exit("Couldn't find any Markdown files. Do you use the file ending .md for "
44 "your Markdown files? If yes, you could try to search directories "
45 "recursively using the -r flag (see help).")
46 return files
49def parse_args() -> argparse.Namespace:
50 """Parse arguments."""
51 argparser = argparse.ArgumentParser(
52 description="Turn URLs in Markdown files into Wayback Machine snapshots."
53 )
54 argparser.add_argument(
55 "items",
56 nargs='+',
57 type=Path,
58 help="Markdown file, or directory containing Markdown files. You can specify "
59 "multiple items and combine individual files with directories"
60 )
61 argparser.add_argument(
62 "-r",
63 "--recursive",
64 action="store_true",
65 help="Recursively search for Markdown files in subdirectories"
66 )
67 return argparser.parse_args()
70def main() -> None:
71 """archive-md-urls cli entry point."""
72 args: argparse.Namespace = parse_args()
73 files: list[Path] = get_md_files(args.items, args.recursive)
74 asyncio.run(update_files(files))
77if __name__ == "__main__":
78 main()