diff --git a/qgis_deployment_toolbelt/cli.py b/qgis_deployment_toolbelt/cli.py index c22caae4..4fc822e1 100644 --- a/qgis_deployment_toolbelt/cli.py +++ b/qgis_deployment_toolbelt/cli.py @@ -29,6 +29,7 @@ parser_rules_context_export, ) from qgis_deployment_toolbelt.commands.deployment import parser_main_deployment +from qgis_deployment_toolbelt.commands.extract import parser_extract_from_profile from qgis_deployment_toolbelt.commands.upgrade import parser_upgrade from qgis_deployment_toolbelt.utils.journalizer import configure_logger @@ -181,6 +182,19 @@ def main(in_args: list[str] = None): add_common_arguments(subcmd_rules_context) parser_rules_context_export(subcmd_rules_context) + # Extractor + subcmd_extract = subparsers.add_parser( + "extract", + aliases=[ + "qgis2qdt", + ], + help="Generate profile ready for QDT from an existing QGIS profile.", + formatter_class=main_parser.formatter_class, + prog="upgrade", + ) + add_common_arguments(subcmd_extract) + parser_extract_from_profile(subcmd_extract) + # Upgrader subcmd_upgrade = subparsers.add_parser( "upgrade", diff --git a/qgis_deployment_toolbelt/commands/extract.py b/qgis_deployment_toolbelt/commands/extract.py new file mode 100644 index 00000000..a8bb9473 --- /dev/null +++ b/qgis_deployment_toolbelt/commands/extract.py @@ -0,0 +1,99 @@ +#! python3 # noqa: E265 + +""" + Sub-command in charge of running the main logic. + + Author: Julien M. (https://github.com/guts) +""" + +# ############################################################################# +# ########## Libraries ############# +# ################################## + +# Standard library +import argparse +import logging +from pathlib import Path + +# submodules +from qgis_deployment_toolbelt.profiles.qdt_profile import QdtProfile +from qgis_deployment_toolbelt.utils.check_path import check_path + +# ############################################################################# +# ########## Globals ############### +# ################################## + +logger = logging.getLogger(__name__) + + +# ############################################################################ +# ########## CLI ################# +# ################################ + + +def parser_extract_from_profile( + subparser: argparse.ArgumentParser, +) -> argparse.ArgumentParser: + """Set the argument parser for deployment subcommand. + + Args: + subparser (argparse.ArgumentParser): parser to set up + + Returns: + argparse.ArgumentParser: parser ready to use + """ + subparser.add_argument( + "-f", + "--from", + "--from-profile-path", + dest="input_profile_path", + help="Path to the QGIS profile to extract.", + type=str, + ) + + subparser.add_argument( + "-t", + "--to", + "--to-profile-path", + dest="output_profile_path", + help="Path where to store the QDT profile.", + type=str, + ) + + subparser.set_defaults(func=run) + + return subparser + + +# ############################################################################ +# ########## MAIN ################ +# ################################ + + +def run(args: argparse.Namespace): + """Run the main logic. + + Args: + args (argparse.Namespace): arguments passed to the subcommand + """ + logger.debug(f"Running {args.command} with {args}") + + # check input profile exists + check_path( + input_path=args.input_profile_path, + must_be_a_file=False, + must_be_a_folder=True, + must_be_readable=True, + raise_error=True, + ) + input_qgis_profile_path = Path(args.input_profile_path) + + # make sure output profile folder exists + output_qdt_profile_path = Path(args.output_profile_path) + output_qdt_profile_path.mkdir(parents=True, exist_ok=True) + + src_profile: QdtProfile = QdtProfile.from_profile_folder( + input_profile_folder=input_qgis_profile_path + ) + + print(src_profile) diff --git a/qgis_deployment_toolbelt/profiles/qdt_profile.py b/qgis_deployment_toolbelt/profiles/qdt_profile.py index f0295508..b872df8a 100644 --- a/qgis_deployment_toolbelt/profiles/qdt_profile.py +++ b/qgis_deployment_toolbelt/profiles/qdt_profile.py @@ -188,6 +188,39 @@ def from_json( **profile_data, ) + @classmethod + def from_profile_folder(cls, input_profile_folder: Path) -> Self: + """Create object from a QGIS profile folder. Must contain a QGIS/QGIS3.ini file. + + Args: + input_profile_folder (Path): path to the folder containgin a QGIS plugin + + Returns: + Self: instanciated object + """ + # check that input path is a folder + check_path( + input_path=input_profile_folder, + must_exists=True, + must_be_a_folder=True, + must_be_a_file=False, + must_be_readable=True, + ) + # check if the folder contains a QGIS3.ini file + profile_qgis_ini = input_profile_folder / "QGIS/QGIS3.ini" + check_path( + input_path=profile_qgis_ini, + must_be_a_file=True, + must_be_readable=True, + must_exists=True, + ) + + # return new instance with loaded object + return cls( + folder=input_profile_folder.name, + loaded_from_json=False, + ) + @property def alias(self) -> str: """Returns the profile's alias.