summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlly Cope <olly@ollycope.com>2022-11-03 10:41:41 +0000
committerOlly Cope <olly@ollycope.com>2022-11-03 10:41:41 +0000
commitf80aa6134e0f48377ee8c2b46baa1fda2a143649 (patch)
tree6988ab588d08d4033a7087a951596516cc0b9242
parent07d8ef949f02abb3563faad58a1142c7400c2949 (diff)
downloadyoyo-f80aa6134e0f48377ee8c2b46baa1fda2a143649.tar.gz
Add new command `yoyo init`
-rw-r--r--yoyo/scripts/init.py55
-rwxr-xr-xyoyo/scripts/main.py5
-rw-r--r--yoyo/tests/test_cli_script.py23
3 files changed, 82 insertions, 1 deletions
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