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

1"""Command line interface.""" 

2 

3import argparse 

4import asyncio 

5import sys 

6from pathlib import Path 

7 

8from archive_md_urls.update_files import update_files 

9 

10 

11def get_md_files(items: list[Path], recursive: bool) -> list[Path]: 

12 """Scan files and directories and create a list of Markdown files. 

13 

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. 

16 

17 Args: 

18 item_list (list[str]): List of items provided via argparse 

19 recursive (bool): Recursively search subdirectories for Markdown files if True 

20 

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 

47 

48 

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() 

68 

69 

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)) 

75 

76 

77if __name__ == "__main__": 

78 main()