Skip to content

Commit dad4fd1

Browse files
committed
feat(cli): Add fmt command for configuration file formatting
why: Provide consistent formatting for vcspull configuration files what: - Create fmt.py module for formatting configuration files - Convert compact format (string URLs) to verbose format - Standardize on 'repo' key instead of 'url' - Sort directories and repositories alphabetically - Add --write flag to apply changes (dry-run by default) - Add --all flag to format all discovered config files - Integrate fmt command into main CLI parser - Simplify argument passing in CLI module refs: Part of scanner-and-add feature implementation
1 parent aa76014 commit dad4fd1

2 files changed

Lines changed: 421 additions & 29 deletions

File tree

src/vcspull/cli/__init__.py

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from .add import add_repo, create_add_subparser
1818
from .add_from_fs import add_from_filesystem, create_add_from_fs_subparser
19+
from .fmt import create_fmt_subparser, format_config_file
1920
from .sync import create_sync_subparser, sync
2021

2122
log = logging.getLogger(__name__)
@@ -93,16 +94,26 @@ def create_parser(
9394
)
9495
create_add_from_fs_subparser(add_from_fs_parser)
9596

97+
fmt_parser = subparsers.add_parser(
98+
"fmt",
99+
help="format vcspull configuration files",
100+
formatter_class=argparse.RawDescriptionHelpFormatter,
101+
description="Format vcspull configuration files for consistency. "
102+
"Normalizes compact format to verbose format, standardizes on 'repo' key, "
103+
"and sorts directories and repositories alphabetically.",
104+
)
105+
create_fmt_subparser(fmt_parser)
106+
96107
if return_subparsers:
97108
# Return all parsers needed by cli() function
98-
return parser, (sync_parser, add_parser, add_from_fs_parser)
109+
return parser, (sync_parser, add_parser, add_from_fs_parser, fmt_parser)
99110
return parser
100111

101112

102113
def cli(_args: list[str] | None = None) -> None:
103114
"""CLI entry point for vcspull."""
104115
parser, subparsers = create_parser(return_subparsers=True)
105-
sync_parser, _add_parser, _add_from_fs_parser = subparsers
116+
sync_parser, _add_parser, _add_from_fs_parser, _fmt_parser = subparsers
106117
args = parser.parse_args(_args)
107118

108119
setup_logger(log=log, level=args.log_level.upper())
@@ -112,34 +123,26 @@ def cli(_args: list[str] | None = None) -> None:
112123
return
113124
if args.subparser_name == "sync":
114125
sync(
115-
repo_patterns=args.repo_patterns if hasattr(args, "repo_patterns") else [],
116-
config=(
117-
pathlib.Path(args.config)
118-
if hasattr(args, "config") and args.config
119-
else None
120-
),
121-
exit_on_error=args.exit_on_error
122-
if hasattr(args, "exit_on_error")
123-
else False,
126+
repo_patterns=args.repo_patterns,
127+
config=pathlib.Path(args.config) if args.config else None,
128+
exit_on_error=args.exit_on_error,
124129
parser=sync_parser,
125130
)
126131
elif args.subparser_name == "add":
127-
add_repo_kwargs = {
128-
"name": args.name,
129-
"url": args.url,
130-
"config_file_path_str": args.config if hasattr(args, "config") else None,
131-
"path": args.path if hasattr(args, "path") else None,
132-
"base_dir": args.base_dir if hasattr(args, "base_dir") else None,
133-
}
134-
add_repo(**add_repo_kwargs)
132+
add_repo(
133+
name=args.name,
134+
url=args.url,
135+
config_file_path_str=args.config,
136+
path=args.path,
137+
base_dir=args.base_dir,
138+
)
135139
elif args.subparser_name == "add-from-fs":
136-
add_from_fs_kwargs = {
137-
"scan_dir_str": args.scan_dir,
138-
"config_file_path_str": args.config if hasattr(args, "config") else None,
139-
"recursive": args.recursive if hasattr(args, "recursive") else False,
140-
"base_dir_key_arg": args.base_dir_key
141-
if hasattr(args, "base_dir_key")
142-
else None,
143-
"yes": args.yes if hasattr(args, "yes") else False,
144-
}
145-
add_from_filesystem(**add_from_fs_kwargs)
140+
add_from_filesystem(
141+
scan_dir_str=args.scan_dir,
142+
config_file_path_str=args.config,
143+
recursive=args.recursive,
144+
base_dir_key_arg=args.base_dir_key,
145+
yes=args.yes,
146+
)
147+
elif args.subparser_name == "fmt":
148+
format_config_file(args.config, args.write, args.all)

0 commit comments

Comments
 (0)