Skip to content

Commit

Permalink
feat: jans-cli group common items in menu (ref: #892) (#1306)
Browse files Browse the repository at this point in the history
* feat: jans-cli group common items in menu (ref: #892)

* feat: jans-cli code smell
  • Loading branch information
devrimyatar authored May 6, 2022
1 parent 8e9c453 commit 819f8f7
Showing 1 changed file with 99 additions and 27 deletions.
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

0 comments on commit 819f8f7

Please sign in to comment.