Skip to content

Commit a4ee3d6

Browse files
committed
implement init command
1 parent ce67929 commit a4ee3d6

File tree

7 files changed

+101
-8
lines changed

7 files changed

+101
-8
lines changed

octavia-cli/octavia_cli/entrypoint.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
import click
99
from airbyte_api_client.api import workspace_api
1010

11+
from .init import commands as init_commands
1112
from .list import commands as list_commands
1213

13-
AVAILABLE_COMMANDS: List[click.Command] = [list_commands._list]
14+
AVAILABLE_COMMANDS: List[click.Command] = [list_commands._list, init_commands.init]
1415

1516

1617
@click.group()
@@ -38,11 +39,6 @@ def add_commands_to_octavia():
3839
octavia.add_command(command)
3940

4041

41-
@octavia.command(help="Scaffolds a local project directories.")
42-
def init():
43-
raise click.ClickException("The init command is not yet implemented.")
44-
45-
4642
@octavia.command(name="import", help="Import an existing resources from the Airbyte instance.")
4743
def _import() -> None:
4844
raise click.ClickException("The import command is not yet implemented.")
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#
2+
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
3+
#
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#
2+
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
3+
#
4+
5+
import os
6+
from typing import Iterable, Tuple
7+
8+
import click
9+
10+
DIRECTORIES_TO_CREATE = {"connections", "destinations", "sources"}
11+
12+
13+
def create_directories(directories_to_create: Iterable[str]) -> Tuple[Iterable[str], Iterable[str]]:
14+
created_directories = []
15+
not_created_directories = []
16+
for directory in directories_to_create:
17+
try:
18+
os.mkdir(directory)
19+
created_directories.append(directory)
20+
except FileExistsError:
21+
not_created_directories.append(directory)
22+
return created_directories, not_created_directories
23+
24+
25+
@click.command(help="Initialize required directories for the project.")
26+
def init():
27+
created_directories, not_created_directories = create_directories(DIRECTORIES_TO_CREATE)
28+
if created_directories:
29+
message = f"✅ Created the following directories: {', '.join(created_directories)}"
30+
click.echo(click.style(message, fg="green"))
31+
if not_created_directories:
32+
message = f"❌ Did not create the following already existing directories: {', '.join(not_created_directories) }"
33+
click.echo(click.style(message, fg="red"))

octavia-cli/unit_tests/test_entrypoint.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def test_commands_in_octavia_group():
4444

4545
@pytest.mark.parametrize(
4646
"command",
47-
[entrypoint.init, entrypoint.apply, entrypoint.create, entrypoint.delete, entrypoint._import],
47+
[entrypoint.apply, entrypoint.create, entrypoint.delete, entrypoint._import],
4848
)
4949
def test_not_implemented_commands(command):
5050
runner = CliRunner()
@@ -54,4 +54,4 @@ def test_not_implemented_commands(command):
5454

5555

5656
def test_available_commands():
57-
assert entrypoint.AVAILABLE_COMMANDS == [entrypoint.list_commands._list]
57+
assert entrypoint.AVAILABLE_COMMANDS == [entrypoint.list_commands._list, entrypoint.init_commands.init]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#
2+
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
3+
#
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#
2+
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
3+
#
4+
5+
import pytest
6+
from click.testing import CliRunner
7+
from octavia_cli.init import commands
8+
9+
10+
def test_directories_to_create():
11+
assert commands.DIRECTORIES_TO_CREATE == {"connections", "destinations", "sources"}
12+
13+
14+
@pytest.mark.parametrize(
15+
"directories_to_create,mkdir_side_effects,expected_created_directories,expected_not_created_directories",
16+
[
17+
(["dir_a", "dir_b"], None, ["dir_a", "dir_b"], []),
18+
(["dir_a", "dir_b"], FileExistsError(), [], ["dir_a", "dir_b"]),
19+
(["dir_a", "dir_b"], [None, FileExistsError()], ["dir_a"], ["dir_b"]),
20+
],
21+
)
22+
def test_create_directories(
23+
mocker, directories_to_create, mkdir_side_effects, expected_created_directories, expected_not_created_directories
24+
):
25+
mocker.patch.object(commands, "os", mocker.Mock(mkdir=mocker.Mock(side_effect=mkdir_side_effects)))
26+
created_directories, not_created_directories = commands.create_directories(directories_to_create)
27+
assert created_directories == expected_created_directories
28+
assert not_created_directories == expected_not_created_directories
29+
commands.os.mkdir.assert_has_calls([mocker.call(d) for d in directories_to_create])
30+
31+
32+
def test_init(mocker):
33+
runner = CliRunner()
34+
mocker.patch.object(commands, "create_directories", mocker.Mock(return_value=(["dir_a", "dir_b"], [])))
35+
result = runner.invoke(commands.init)
36+
assert result.exit_code == 0
37+
assert result.output == "✅ Created the following directories: dir_a, dir_b\n"
38+
39+
40+
def test_init_some_existing_directories(mocker):
41+
runner = CliRunner()
42+
mocker.patch.object(commands, "create_directories", mocker.Mock(return_value=(["dir_a"], ["dir_b"])))
43+
result = runner.invoke(commands.init)
44+
assert result.exit_code == 0
45+
assert (
46+
result.output == "✅ Created the following directories: dir_a\n❌ Did not create the following already existing directories: dir_b\n"
47+
)
48+
49+
50+
def test_init_all_existing_directories(mocker):
51+
runner = CliRunner()
52+
mocker.patch.object(commands, "create_directories", mocker.Mock(return_value=([], ["dir_a", "dir_b"])))
53+
result = runner.invoke(commands.init)
54+
assert result.exit_code == 0
55+
assert result.output == "❌ Did not create the following already existing directories: dir_a, dir_b\n"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#
2+
# Copyright (c) 2021 Airbyte, Inc., all rights reserved.
3+
#

0 commit comments

Comments
 (0)