Skip to content

Commit 26d4dae

Browse files
authored
Merge pull request #19 from bugout-dev/cli-app-resources-imprv
Application change group CLI
2 parents fb604d7 + 4885a89 commit 26d4dae

4 files changed

Lines changed: 211 additions & 1 deletion

File tree

brood/actions.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,16 @@ def kv_brood_as_json_dict(kv_brood: KVBrood) -> Dict[str, Any]:
312312
return kv_brood_json
313313

314314

315+
def application_as_json_dict(application: Application) -> Dict[str, Any]:
316+
application_json = {
317+
"id": str(application.id),
318+
"group_id": str(application.group_id),
319+
"name": application.name,
320+
"description": application.description,
321+
}
322+
return application_json
323+
324+
315325
def get_password_context() -> CryptContext:
316326
"""
317327
Generate a passlib context for Brood passwords.

brood/cli.py

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from . import actions
1111
from . import data
12+
from . import exceptions
1213
from . import subscriptions
1314
from .external import SessionLocal
1415
from .models import (
@@ -19,6 +20,7 @@
1920
Subscription,
2021
SubscriptionPlan,
2122
KVBrood,
23+
Application,
2224
)
2325

2426

@@ -622,6 +624,60 @@ def kv_delete_handler(args: argparse.Namespace) -> None:
622624
session.close()
623625

624626

627+
def applications_list_handler(args: argparse.Namespace) -> None:
628+
"""
629+
Handler for "applications list" command.
630+
"""
631+
session = SessionLocal()
632+
try:
633+
query = session.query(Application)
634+
if args.group is not None:
635+
query = query.filter(Application.group_id == args.group)
636+
637+
applications = query.all()
638+
639+
print(
640+
json.dumps(
641+
{
642+
"applications": [
643+
actions.application_as_json_dict(application)
644+
for application in applications
645+
]
646+
}
647+
)
648+
)
649+
finally:
650+
session.close()
651+
652+
653+
def application_create_handler(args: argparse.Namespace) -> None:
654+
session = SessionLocal()
655+
try:
656+
application = Application(
657+
group_id=args.group, name=args.name, description=args.description,
658+
)
659+
session.add(application)
660+
session.commit()
661+
print(json.dumps(actions.application_as_json_dict(application)))
662+
finally:
663+
session.close()
664+
665+
666+
def application_migrate_handler(args: argparse.Namespace) -> None:
667+
session = SessionLocal()
668+
try:
669+
query = session.query(Application).filter(Application.id == args.application)
670+
application = query.one_or_none()
671+
if application is None:
672+
raise exceptions.ApplicationsNotFound("Application not found")
673+
674+
query.update({Application.group_id: args.group})
675+
session.commit()
676+
print(json.dumps(actions.application_as_json_dict(application)))
677+
finally:
678+
session.close()
679+
680+
625681
def main() -> None:
626682
parser = argparse.ArgumentParser(description="Brood CLI")
627683
parser.set_defaults(func=lambda _: parser.print_help())
@@ -1071,6 +1127,45 @@ def main() -> None:
10711127
)
10721128
parser_kv_delete.set_defaults(func=kv_delete_handler)
10731129

1130+
# Applications command parser
1131+
parser_applications = subcommands.add_parser(
1132+
"applications", description="Brood applications"
1133+
)
1134+
parser_applications.set_defaults(func=lambda _: parser_applications.print_help())
1135+
subcommands_applications = parser_applications.add_subparsers(
1136+
description="Brood application commands"
1137+
)
1138+
parser_applications_list = subcommands_applications.add_parser(
1139+
"list", description="List all applications"
1140+
)
1141+
parser_applications_list.add_argument(
1142+
"-g", "--group", help="Filter applications by group ID"
1143+
)
1144+
parser_applications_list.set_defaults(func=applications_list_handler)
1145+
parser_applications_create = subcommands_applications.add_parser(
1146+
"create", description="Create new application"
1147+
)
1148+
parser_applications_create.add_argument(
1149+
"-g", "--group", required=True, help="Filter applications by group ID"
1150+
)
1151+
parser_applications_create.add_argument(
1152+
"-n", "--name", required=True, help="Name of application"
1153+
)
1154+
parser_applications_create.add_argument(
1155+
"-d", "--description", help="Description of application"
1156+
)
1157+
parser_applications_create.set_defaults(func=application_create_handler)
1158+
parser_applications_migrate = subcommands_applications.add_parser(
1159+
"migrate", description="Migrate application to another group"
1160+
)
1161+
parser_applications_migrate.add_argument(
1162+
"-a", "--application", required=True, help="Applications ID"
1163+
)
1164+
parser_applications_migrate.add_argument(
1165+
"-g", "--group", required=True, help="Group ID migrate to"
1166+
)
1167+
parser_applications_migrate.set_defaults(func=application_migrate_handler)
1168+
10741169
args = parser.parse_args()
10751170
args.func(args)
10761171

brood/resources/cli.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
"""
2+
Brood resources CLI
3+
"""
4+
import argparse
5+
import json
6+
7+
from .models import Resource
8+
from ..external import SessionLocal
9+
10+
11+
def resources_list_handler(args: argparse.Namespace) -> None:
12+
session = SessionLocal()
13+
try:
14+
query = session.query(Resource)
15+
if args.application is not None:
16+
query = query.filter(Resource.application_id == args.application)
17+
resources = query.all()
18+
19+
print(
20+
json.dumps(
21+
{
22+
"resources": [
23+
{
24+
"id": str(resource.id),
25+
"application_id": str(resource.application_id),
26+
"resource_data": resource.resource_data,
27+
"created_at": str(resource.created_at),
28+
"updated_at": str(resource.updated_at),
29+
}
30+
for resource in resources
31+
]
32+
}
33+
)
34+
)
35+
finally:
36+
session.close()
37+
38+
39+
def resources_create_handler(args: argparse.Namespace) -> None:
40+
session = SessionLocal()
41+
try:
42+
resource = Resource(
43+
application_id=args.application, resource_data=json.loads(args.data),
44+
)
45+
session.add(resource)
46+
session.commit()
47+
48+
print(
49+
json.dumps(
50+
{
51+
"id": str(resource.id),
52+
"application_id": str(resource.application_id),
53+
"resource_data": resource.resource_data,
54+
"created_at": str(resource.created_at),
55+
"updated_at": str(resource.updated_at),
56+
}
57+
)
58+
)
59+
finally:
60+
session.close()
61+
62+
63+
def main() -> None:
64+
parser = argparse.ArgumentParser(description="Brood resources CLI")
65+
parser.set_defaults(func=lambda _: parser.print_help())
66+
subcommands = parser.add_subparsers(description="Brood resources commands")
67+
68+
parser_resources = subcommands.add_parser(
69+
"resources", description="Brood resources"
70+
)
71+
parser_resources.set_defaults(func=lambda _: parser_resources.print_help())
72+
subcommands_resources = parser_resources.add_subparsers(
73+
description="Brood user commands"
74+
)
75+
76+
# Resources command parser
77+
parser_resources_list = subcommands_resources.add_parser(
78+
"list", description="List Brood resources"
79+
)
80+
parser_resources_list.add_argument(
81+
"-a", "--application", help="Application ID filter",
82+
)
83+
parser_resources_list.set_defaults(func=resources_list_handler)
84+
parser_resources_create = subcommands_resources.add_parser(
85+
"create", description="Create Brood resources"
86+
)
87+
parser_resources_create.add_argument(
88+
"-a", "--application", help="Application ID filter",
89+
)
90+
parser_resources_create.add_argument(
91+
"-d", "--data", help="Resource data, as ex: '{\"age\": 23}'",
92+
)
93+
parser_resources_create.set_defaults(func=resources_create_handler)
94+
95+
args = parser.parse_args()
96+
args.func(args)
97+
98+
99+
if __name__ == "__main__":
100+
main()

setup.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,10 @@
3333
"Programming Language :: Python",
3434
],
3535
url="https://github.com/simiotics/brood",
36-
entry_points={"console_scripts": ["brood=brood.cli:main"]},
36+
entry_points={
37+
"console_scripts": [
38+
"brood=brood.cli:main",
39+
"resources=brood.resources.cli:main",
40+
]
41+
},
3742
)

0 commit comments

Comments
 (0)