mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
- Fixes metaprogramming to inject methods during shell class object's runtime - This enable new apis that are synced to come up with new verbs, docs etc. - Fixes printing issue - Fixes null bitfield parsing issue Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
121 lines
3.7 KiB
Python
121 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
try:
|
|
from pygments import highlight
|
|
from pygments.console import ansiformat
|
|
from pygments.formatter import Formatter
|
|
from pygments.formatters import Terminal256Formatter
|
|
from pygments.lexer import bygroups, include, RegexLexer
|
|
from pygments.token import *
|
|
|
|
import sys
|
|
except ImportError, e:
|
|
print e
|
|
|
|
|
|
MONKEY_COLORS = {
|
|
Token: '',
|
|
Whitespace: 'reset',
|
|
Text: 'reset',
|
|
|
|
Name: 'green',
|
|
Operator: 'teal',
|
|
Operator.Word: 'lightgray',
|
|
String: 'purple',
|
|
|
|
Keyword: '_red_',
|
|
Error: 'red',
|
|
Literal: 'yellow',
|
|
Number: 'blue',
|
|
}
|
|
|
|
|
|
def get_colorscheme():
|
|
return MONKEY_COLORS
|
|
|
|
|
|
class MonkeyLexer(RegexLexer):
|
|
keywords = ['[a-z]*id', '^[a-z A-Z]*:']
|
|
attributes = ['[Tt]rue', '[Ff]alse']
|
|
params = ['[a-z]*[Nn]ame', 'type', '[Ss]tate']
|
|
|
|
uuid_rgx = r'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
|
|
date_rgx = r'[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9:]{8}-[0-9]{4}'
|
|
|
|
def makelistre(lis):
|
|
return r'(' + r'|'.join(lis) + r')'
|
|
|
|
tokens = {
|
|
'root': [
|
|
(r' ', Whitespace),
|
|
(date_rgx, Number),
|
|
(uuid_rgx, Literal),
|
|
(r'(?:\b\d+\b(?:-\b\d+|%)?)', Number),
|
|
(r'^[-=]*\n', Operator.Word),
|
|
(r'Error', Error),
|
|
(makelistre(attributes), Literal),
|
|
(makelistre(params) + r'( = )(.*)', bygroups(Name, Operator,
|
|
String)),
|
|
(makelistre(keywords), Keyword),
|
|
(makelistre(params), Name),
|
|
(r'(^[a-zA-Z]* )(=)', bygroups(Name, Operator)),
|
|
(r'\S+', Text),
|
|
]
|
|
}
|
|
|
|
def analyse_text(text):
|
|
npos = text.find('\n')
|
|
if npos < 3:
|
|
return False
|
|
return text[0] == '[' and text[npos - 1] == ']'
|
|
|
|
|
|
class MonkeyFormatter(Formatter):
|
|
def __init__(self, **options):
|
|
Formatter.__init__(self, **options)
|
|
self.colorscheme = get_colorscheme()
|
|
|
|
def format(self, tokensource, outfile):
|
|
return Formatter.format(self, tokensource, outfile)
|
|
|
|
def format_unencoded(self, tokensource, outfile):
|
|
for ttype, value in tokensource:
|
|
color = self.colorscheme.get(ttype)
|
|
while color is None:
|
|
ttype = ttype[:-1]
|
|
color = self.colorscheme.get(ttype)
|
|
if color:
|
|
spl = value.split('\n')
|
|
for line in spl[:-1]:
|
|
if line:
|
|
outfile.write(ansiformat(color, line))
|
|
outfile.write('\n')
|
|
if spl[-1]:
|
|
outfile.write(ansiformat(color, spl[-1]))
|
|
else:
|
|
outfile.write(value)
|
|
|
|
|
|
def monkeyprint(text):
|
|
fmter = MonkeyFormatter()
|
|
lexer = MonkeyLexer()
|
|
lexer.encoding = 'utf-8'
|
|
fmter.encoding = 'utf-8'
|
|
highlight(text, lexer, fmter, sys.stdout)
|