Changelog (versions):
rich
example.field_with_params
. And an improved example to go with that.Todo (maybe):
child_field
when it shouldn't be recognized at all.def pretty_query(query_string: str) -> str:
import re
from rich.console import Console
from rich.highlighter import JSONHighlighter
from rich.theme import Theme, DEFAULT_STYLES
# this is a string, not a tuple
field_with_params_rgx = (
r'(?P<field_with_params>[^{ }]+' # fields with parameters
r'(?P<parenth_open>\()' # opening parenthesis
r'(?P<keyword>[^\(\s]\w+)\s?' # keywords and colons
r'(?P<colon>\:)\s?' # keywords and colons
r'(?P<value>' # parameter values
r'(?P<list_open>\[?).+?' # opening square bracket
r'(?P<list_close>\]?))\s?' # closing square bracket
r'(?P<parenth_close>\)))' # closing parenthesis
)
regexes = [
field_with_params_rgx,
r'(?P<BEGIN>^\{)|(?P<open>\{)|(?P<END>\}$)|(?P<close>\})', # curly brackets
r'(?P<fragment>(?P<dots>\.{3})\s*?(?P<on>on)\s+?(?P<frag_field>\w+))', # fragments
r'(?P<parent_field>(?!(?P=field_with_params)|(?P=fragment))\w+)(?=\s*?\{)', # parent fields
r'(?P<child_field>(?!(?P=field_with_params)|(?P=fragment))\w+)', # child fields
]
indent = 2
count = 0
parts = []
for x in re.finditer('|'.join(rgx for rgx in regexes), query_string):
data = x.groupdict()
string = ''
BEGIN = data['BEGIN']
open = data['open']
parent_field = data['field_with_params'] or data['parent_field']
child_field = data['child_field']
fragment = data['fragment']
close = data['close']
END = data['END']
if BEGIN:
string += BEGIN
count += indent
if open:
count += indent
continue
if parent_field:
string += '{0: >{fill}}{value} {{'.format(' ', value=parent_field, fill=count)
if child_field:
string += '{0: >{fill}}{value}'.format(' ', value=child_field, fill=count)
if fragment:
string += '{0: >{fill}}{value} {{'.format(' ', value=fragment, fill=count)
if close:
count -= indent
string += '{0: >{fill}}{value}'.format(' ', value=close, fill=count)
if END:
string += END
count -= indent
parts.append(string)
class GQLHighlighter(JSONHighlighter):
base_style = "gql."
highlights = ['|'.join(rgx for rgx in regexes)] + JSONHighlighter.highlights
theme = Theme({
**{
f'gql.{k}': DEFAULT_STYLES[f'json.{k}']
for k in ['brace', 'bool_true', 'bool_false', 'null', 'number', 'str', 'key']
},
'gql.BEGIN': 'bold green',
'gql.END': 'bold green',
'gql.open': 'bold yellow',
'gql.close': 'bold blue',
'gql.field_with_params': 'bold blue',
'gql.parent_field': 'bold white',
'gql.child_field': 'italic green',
'gql.fragment': 'bold yellow',
'gql.dots': 'bold white',
'gql.on': 'green',
'gql.frag_field': 'bold magenta italic',
'gql.parenth_open': 'blue',
'gql.parenth_close': 'green',
'gql.keyword': 'yellow',
'gql.colon': 'blue',
'gql.list_open': 'bold yellow',
'gql.list_close': 'bold yellow',
'gql.value': 'cyan',
})
console = Console(highlighter=GQLHighlighter(), theme=theme)
console.print('\n'.join(parts))
return '\n'.join(parts)