euscan: make eend works again
Simplify einfo/ewarn/eend handling (for now) and make "message" someting containing only what stdout would contain. We loose some informations, but I'm really not sure we need more. Signed-off-by: Corentin Chary <corentin.chary@gmail.com>
This commit is contained in:
parent
687851ffcb
commit
305fdea0c7
@ -3,17 +3,8 @@
|
|||||||
# Copyright 2011 Corentin Chary <corentin.chary@gmail.com>
|
# Copyright 2011 Corentin Chary <corentin.chary@gmail.com>
|
||||||
# Distributed under the terms of the GNU General Public License v2
|
# Distributed under the terms of the GNU General Public License v2
|
||||||
|
|
||||||
from io import StringIO
|
|
||||||
from collections import defaultdict
|
|
||||||
import json
|
|
||||||
|
|
||||||
from gentoolkit import pprinter as pp
|
|
||||||
from portage.output import EOutput
|
|
||||||
|
|
||||||
|
|
||||||
__version__ = "git"
|
__version__ = "git"
|
||||||
|
|
||||||
|
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
'nocolor': False,
|
'nocolor': False,
|
||||||
'quiet': False,
|
'quiet': False,
|
||||||
@ -75,93 +66,5 @@ ROBOTS_TXT_BLACKLIST_DOMAINS = [
|
|||||||
'(.*)nodejs.org(.*)',
|
'(.*)nodejs.org(.*)',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
from out import EuscanOutput
|
||||||
class EOutputFile(EOutput):
|
output = out.EuscanOutput(CONFIG)
|
||||||
"""
|
|
||||||
Override of EOutput, allows to specify an output file for writes
|
|
||||||
"""
|
|
||||||
def __init__(self, out_file=None, *args, **kwargs):
|
|
||||||
super(EOutputFile, self).__init__(*args, **kwargs)
|
|
||||||
self.out_file = out_file
|
|
||||||
|
|
||||||
def _write(self, f, msg):
|
|
||||||
if self.out_file is None:
|
|
||||||
super(EOutputFile, self)._write(f, msg)
|
|
||||||
else:
|
|
||||||
super(EOutputFile, self)._write(self.out_file, msg)
|
|
||||||
|
|
||||||
|
|
||||||
class EuscanOutput(object):
|
|
||||||
"""
|
|
||||||
Class that handles output for euscan
|
|
||||||
"""
|
|
||||||
def __init__(self, config):
|
|
||||||
self.config = config
|
|
||||||
self.queries = defaultdict(dict)
|
|
||||||
self.current_query = None
|
|
||||||
|
|
||||||
def set_query(self, query):
|
|
||||||
self.current_query = query
|
|
||||||
if query is not None:
|
|
||||||
if not query in self.queries:
|
|
||||||
self.queries[query] = {
|
|
||||||
"messages": defaultdict(StringIO),
|
|
||||||
"result": [],
|
|
||||||
"metadata": {},
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_formatted_output(self):
|
|
||||||
data = {}
|
|
||||||
|
|
||||||
for query in self.queries:
|
|
||||||
data[query] = {
|
|
||||||
"result": self.queries[query]["result"],
|
|
||||||
"metadata": self.queries[query]["metadata"],
|
|
||||||
"messages": {}
|
|
||||||
}
|
|
||||||
for key in self.queries[query]["messages"]:
|
|
||||||
if key not in ("ebegin", "eend"):
|
|
||||||
_msg = self.queries[query]["messages"][key].getvalue()
|
|
||||||
val = [x for x in _msg.split("\n") if x]
|
|
||||||
data[query]["messages"][key] = val
|
|
||||||
|
|
||||||
if self.config["format"].lower() == "json":
|
|
||||||
return json.dumps(data, indent=self.config["indent"])
|
|
||||||
else:
|
|
||||||
raise TypeError("Invalid output format")
|
|
||||||
|
|
||||||
def result(self, cp, version, url, handler, confidence):
|
|
||||||
from euscan.helpers import get_version_type
|
|
||||||
|
|
||||||
if self.config['format']:
|
|
||||||
_curr = self.queries[self.current_query]
|
|
||||||
_curr["result"].append(
|
|
||||||
{"version": version, "urls": [url], "handler": handler,
|
|
||||||
"confidence": confidence, "type": get_version_type(version)}
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
if not self.config['quiet']:
|
|
||||||
print "Upstream Version:", pp.number("%s" % version),
|
|
||||||
print pp.path(" %s" % url)
|
|
||||||
else:
|
|
||||||
print pp.cpv("%s-%s" % (cp, version)) + ":", pp.path(url)
|
|
||||||
|
|
||||||
def metadata(self, key, value, show=True):
|
|
||||||
if self.config["format"]:
|
|
||||||
self.queries[self.current_query]["metadata"][key] = value
|
|
||||||
elif show:
|
|
||||||
print "%s: %s" % (key.capitalize(), value)
|
|
||||||
|
|
||||||
def __getattr__(self, key):
|
|
||||||
if self.config["format"]:
|
|
||||||
out_file = self.queries[self.current_query]["messages"][key]
|
|
||||||
|
|
||||||
_output = EOutputFile(out_file=out_file,
|
|
||||||
quiet=self.config['quiet'])
|
|
||||||
ret = getattr(_output, key)
|
|
||||||
else:
|
|
||||||
ret = getattr(EOutputFile(quiet=self.config['quiet']), key)
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
output = EuscanOutput(CONFIG)
|
|
||||||
|
89
pym/euscan/out.py
Normal file
89
pym/euscan/out.py
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
from io import StringIO
|
||||||
|
from collections import defaultdict
|
||||||
|
import json
|
||||||
|
|
||||||
|
from gentoolkit import pprinter as pp
|
||||||
|
from portage.output import EOutput
|
||||||
|
|
||||||
|
class EOutputMem(EOutput):
|
||||||
|
"""
|
||||||
|
Override of EOutput, allows to specify an output file for writes
|
||||||
|
"""
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(EOutputMem, self).__init__(*args, **kwargs)
|
||||||
|
self.out = StringIO()
|
||||||
|
|
||||||
|
def getvalue(self):
|
||||||
|
return self.out.getvalue()
|
||||||
|
|
||||||
|
def _write(self, f, msg):
|
||||||
|
super(EOutputMem, self)._write(self.out, msg)
|
||||||
|
|
||||||
|
class EuscanOutput(object):
|
||||||
|
"""
|
||||||
|
Class that handles output for euscan
|
||||||
|
"""
|
||||||
|
def __init__(self, config):
|
||||||
|
self.config = config
|
||||||
|
self.queries = defaultdict(dict)
|
||||||
|
self.current_query = None
|
||||||
|
|
||||||
|
def set_query(self, query):
|
||||||
|
self.current_query = query
|
||||||
|
if query is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if query in self.queries:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.config["format"]:
|
||||||
|
output = EOutputMem()
|
||||||
|
else:
|
||||||
|
output = EOutput()
|
||||||
|
|
||||||
|
self.queries[query] = {
|
||||||
|
"output": output,
|
||||||
|
"result": [],
|
||||||
|
"metadata": {},
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_formatted_output(self):
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
for query in self.queries:
|
||||||
|
data[query] = {
|
||||||
|
"result": self.queries[query]["result"],
|
||||||
|
"metadata": self.queries[query]["metadata"],
|
||||||
|
"messages": self.queries[query]["output"].getvalue(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.config["format"].lower() == "json":
|
||||||
|
return json.dumps(data, indent=self.config["indent"])
|
||||||
|
else:
|
||||||
|
raise TypeError("Invalid output format")
|
||||||
|
|
||||||
|
def result(self, cp, version, url, handler, confidence):
|
||||||
|
from euscan.helpers import get_version_type
|
||||||
|
|
||||||
|
if self.config['format']:
|
||||||
|
_curr = self.queries[self.current_query]
|
||||||
|
_curr["result"].append(
|
||||||
|
{"version": version, "urls": [url], "handler": handler,
|
||||||
|
"confidence": confidence, "type": get_version_type(version)}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if not self.config['quiet']:
|
||||||
|
print "Upstream Version:", pp.number("%s" % version),
|
||||||
|
print pp.path(" %s" % url)
|
||||||
|
else:
|
||||||
|
print pp.cpv("%s-%s" % (cp, version)) + ":", pp.path(url)
|
||||||
|
|
||||||
|
def metadata(self, key, value, show=True):
|
||||||
|
if self.config["format"]:
|
||||||
|
self.queries[self.current_query]["metadata"][key] = value
|
||||||
|
elif show:
|
||||||
|
print "%s: %s" % (key.capitalize(), value)
|
||||||
|
|
||||||
|
def __getattr__(self, key):
|
||||||
|
output = self.queries[self.current_query]["output"]
|
||||||
|
return getattr(output, key)
|
Loading…
Reference in New Issue
Block a user