From f80aa6134e0f48377ee8c2b46baa1fda2a143649 Mon Sep 17 00:00:00 2001 From: Olly Cope Date: Thu, 3 Nov 2022 10:41:41 +0000 Subject: Add new command `yoyo init` --- yoyo/scripts/init.py | 55 +++++++++++++++++++++++++++++++++++++++++++ yoyo/scripts/main.py | 5 +++- yoyo/tests/test_cli_script.py | 23 ++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 yoyo/scripts/init.py diff --git a/yoyo/scripts/init.py b/yoyo/scripts/init.py new file mode 100644 index 0000000..96b04e9 --- /dev/null +++ b/yoyo/scripts/init.py @@ -0,0 +1,55 @@ +# Copyright 2022 Oliver Cope +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pathlib +import logging +import sys + +from yoyo.config import CONFIG_FILENAME +from yoyo.scripts.main import save_config + +logger = logging.getLogger("yoyo.migrations") + + +def install_argparsers(global_parser, subparsers): + parser = subparsers.add_parser( + "init", parents=[global_parser], help="Initialize a new project" + ) + parser.set_defaults(func=init) + parser.add_argument("sources", nargs=1, help="Directory for migration scripts") + parser.add_argument( + "-d", + "--database", + help="Database, eg 'sqlite:///path/to/sqlite.db' " + "or 'postgresql://user@host/db'", + ) + + +def init(args, config) -> int: + + if args.config: + configpath = pathlib.Path(args.config) + else: + configpath = pathlib.Path.cwd() / CONFIG_FILENAME + migrations_path = pathlib.Path(args.sources[0]).resolve() + + if configpath.exists(): + print("Existing configuration file found, exiting", file=sys.stderr) + return 1 + save_config(config, configpath) + print(f"Saved configuration to {configpath}") + if not migrations_path.exists(): + migrations_path.mkdir(exist_ok=True, parents=True) + print(f"Created migrations directory {migrations_path}") + return 0 diff --git a/yoyo/scripts/main.py b/yoyo/scripts/main.py index d9894ef..3e9f76d 100755 --- a/yoyo/scripts/main.py +++ b/yoyo/scripts/main.py @@ -140,8 +140,11 @@ def make_argparser(): subparsers = argparser.add_subparsers(help="Commands help") - from . import migrate, newmigration + from . import migrate + from . import newmigration + from . import init + init.install_argparsers(global_parser, subparsers) migrate.install_argparsers(global_parser, subparsers) newmigration.install_argparsers(global_parser, subparsers) diff --git a/yoyo/tests/test_cli_script.py b/yoyo/tests/test_cli_script.py index 8199ee1..1160667 100644 --- a/yoyo/tests/test_cli_script.py +++ b/yoyo/tests/test_cli_script.py @@ -17,6 +17,7 @@ from datetime import datetime from tempfile import mkdtemp from functools import partial from itertools import count +import pathlib import io import os import os.path @@ -596,3 +597,25 @@ class TestDevelopCommand(TestInteractiveScript): ("m1", "apply"), ("m2", "apply"), ] + + +class TestInitCommand(TestInteractiveScript): + def test_it_creates_project(self): + main(["-b", "init", "migrations", "--database", "sqlite://foo"]) + config = (pathlib.Path(self.tmpdir) / "yoyo.ini").read_text() + assert "database = sqlite://foo" in config + assert "sources = migrations" in config + assert (pathlib.Path(self.tmpdir) / "migrations").is_dir() + + def test_it_doesnt_overwrite(self): + configfile = pathlib.Path(self.tmpdir) / "yoyo.ini" + configfile.write_text("[existing file]") + main(["-b", "init", "migrations", "--database", "sqlite://foo"]) + assert "database = sqlite://foo" not in configfile.read_text() + assert "existing file" in configfile.read_text() + assert not (pathlib.Path(self.tmpdir) / "migrations").exists() + + def test_it_doesnt_prompt(self): + with patch("yoyo.scripts.main.prompt_save_config") as prompt_save_config: + main(["-b", "init", "migrations", "--database", "sqlite://foo"]) + assert prompt_save_config.called is False -- cgit v1.2.1