Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: jans-cli group common items in menu (ref: #892) #1306

Merged
merged 2 commits into from
May 6, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 99 additions & 27 deletions jans-cli/cli/config_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@
import traceback
import ast
import base64

import pprint

from pathlib import Path
from types import SimpleNamespace
from urllib.parse import urlencode
from collections import OrderedDict
from prompt_toolkit import prompt, HTML
Expand Down Expand Up @@ -209,6 +210,7 @@ class Menu(object):

def __init__(self, name, method='', info={}, path=''):
self.name = name
self.display_name = name
self.method = method
self.info = info
self.path = path
Expand All @@ -221,7 +223,7 @@ def __iter__(self):
return self

def __repr__(self):
return self.name
return self.display_name
self.__print_child(self)

def tree(self):
Expand Down Expand Up @@ -420,35 +422,94 @@ def guess_param_mapping(self, param_s):

def make_menu(self):

menu = Menu('Main Menu')
menu_groups = []

for tag in self.cfg_yml['tags']:
if tag['name'] != 'developers':
m = Menu(name=tag['name'])
menu.add_child(m)
for path in self.cfg_yml['paths']:
for method in self.cfg_yml['paths'][path]:
def get_sep_pos(s):
for i, c in enumerate(s):
if c in ('-', '–'):
return i
return -1

if 'tags' in self.cfg_yml['paths'][path][method] and m.name in \
self.cfg_yml['paths'][path][method]['tags'] and 'operationId' in \
self.cfg_yml['paths'][path][method]:
def get_group_obj(mname):
for grp in menu_groups:
if grp.mname == mname:
return grp

if isinstance(self.cfg_yml['paths'][path][method], dict) and self.cfg_yml['paths'][path][method].get('x-cli-plugin') and not self.cfg_yml['paths'][path][method]['x-cli-plugin'] in plugins:
if m in menu.children:
menu.children.remove(m)
continue

menu_name = self.cfg_yml['paths'][path][method].get('summary') or \
self.cfg_yml['paths'][path][method].get('description')
for tag in self.cfg_yml['tags']:
tname = tag['name'].strip()
if tname == 'developers':
continue
n = get_sep_pos(tname)
mname = tname[:n].strip() if n > -1 else tname
grp = get_group_obj(mname)
if not grp:
grp = SimpleNamespace()
grp.tag = None if n > -1 else tname
grp.mname = mname
grp.submenu = []
menu_groups.append(grp)

if n > -1:
sname = tname[n+1:].strip()
sub = SimpleNamespace()
sub.tag = tname
sub.mname = sname
grp.submenu.append(sub)


def get_methods_of_tag(tag):
methods = []
if tag:
for path_name in self.cfg_yml['paths']:
path = self.cfg_yml['paths'][path_name]
for method_name in path:
method = path[method_name]
if 'tags' in method and tag in method['tags'] and 'operationId' in method:
method['__method_name__'] = method_name
method['__path_name__'] = path_name
methods.append(method)

return methods

sm = Menu(
name=menu_name.strip('.'),
method=method,
info=self.cfg_yml['paths'][path][method],
path=path,
)
menu = Menu('Main Menu')

m.add_child(sm)

for grp in menu_groups:
m = Menu(name=grp.mname)
m.display_name = m.name + ' ˅'
menu.add_child(m)
methods = get_methods_of_tag(grp.tag)

for method in methods:
for tag in method['tags']:
menu_name = method.get('summary') or method.get('description')
sm = Menu(
name=menu_name.strip('.'),
method=method['__method_name__'],
info=method,
path=method['__path_name__'],
)
m.add_child(sm)

if grp.submenu:
m.display_name = m.name + ' ˅'
for sub in grp.submenu:
smenu = Menu(name=sub.mname)
smenu.display_name = smenu.name + ' ˅'
m.add_child(smenu)
methods = get_methods_of_tag(sub.tag)
for method in methods:
for tag in method['tags']:

sub_menu_name = method.get('summary') or method.get('description')
ssm = Menu(
name=sub_menu_name.strip('.'),
method=method['__method_name__'],
info=method,
path=method['__path_name__'],
)
smenu.add_child(ssm)

self.menu = menu

Expand Down Expand Up @@ -1330,7 +1391,7 @@ def get_api_caller(self, endpoint):
if security.strip():
self.get_access_token(security)

client = getattr(swagger_client, self.get_api_class_name(endpoint.parent.name))
client = getattr(swagger_client, self.get_api_class_name(endpoint.info['tags'][0]))
api_instance = self.get_api_instance(client)
api_caller = getattr(api_instance, endpoint.info['operationId'].replace('-', '_'))

Expand Down Expand Up @@ -1719,7 +1780,18 @@ def display_menu(self, menu):
clear()
self.current_menu = menu

self.print_underlined(menu.name)
name_list = [menu.name]
par = menu
while True:
par = par.parent
if not par:
break
name_list.insert(0, par.name)

if len(name_list) > 1:
del name_list[0]

self.print_underlined(': '.join(name_list))

selection_values = ['q', 'x', 'b']

Expand Down