euscan: adding json output
Naive json output implmented, probably needs some further tuning Signed-off-by: volpino <fox91@anche.no>
This commit is contained in:
		@@ -3,11 +3,17 @@
 | 
			
		||||
# Copyright 2011 Corentin Chary <corentin.chary@gmail.com>
 | 
			
		||||
# 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"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from portage.output import EOutput
 | 
			
		||||
 | 
			
		||||
CONFIG = {
 | 
			
		||||
    'nocolor': False,
 | 
			
		||||
    'quiet': False,
 | 
			
		||||
@@ -20,11 +26,11 @@ CONFIG = {
 | 
			
		||||
    'oneshot': True,
 | 
			
		||||
    'user-agent': 'escan (http://euscan.iksaif.net)',
 | 
			
		||||
    'skip-robots-txt': False,
 | 
			
		||||
    'cache': False
 | 
			
		||||
    'cache': False,
 | 
			
		||||
    'format': None,
 | 
			
		||||
    'indent': 2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
output = EOutput(CONFIG['quiet'])
 | 
			
		||||
 | 
			
		||||
BLACKLIST_VERSIONS = [
 | 
			
		||||
    # Compatibility package for running binaries linked against a
 | 
			
		||||
    # pre gcc 3.4 libstdc++, won't be updated
 | 
			
		||||
@@ -67,3 +73,67 @@ ROBOTS_TXT_BLACKLIST_DOMAINS = [
 | 
			
		||||
    '(.*)chromium.org(.*)',
 | 
			
		||||
    '(.*)nodejs.org(.*)',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EOutputFile(EOutput):
 | 
			
		||||
    """
 | 
			
		||||
    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.data = defaultdict(StringIO)
 | 
			
		||||
        self.packages = defaultdict(list)
 | 
			
		||||
 | 
			
		||||
    def get_formatted_output(self):
 | 
			
		||||
        data = {}
 | 
			
		||||
        for key in self.data:
 | 
			
		||||
            if key not in ("ebegin", "eend"):
 | 
			
		||||
                val = [x for x in self.data[key].getvalue().split("\n") if x]
 | 
			
		||||
                data[key] = val
 | 
			
		||||
 | 
			
		||||
        data["result"] = self.packages
 | 
			
		||||
 | 
			
		||||
        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):
 | 
			
		||||
        if self.config['format']:
 | 
			
		||||
            self.packages[cp].append({"version": version, "url": url})
 | 
			
		||||
        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 __getattr__(self, key):
 | 
			
		||||
        output_file = self.data[key] if self.config["format"] else None
 | 
			
		||||
 | 
			
		||||
        if output_file:
 | 
			
		||||
            _output = EOutputFile(out_file=self.data[key],
 | 
			
		||||
                                  quiet=self.config['quiet'])
 | 
			
		||||
            ret = getattr(_output, key)
 | 
			
		||||
        else:
 | 
			
		||||
            ret = getattr(EOutputFile(quiet=self.config['quiet']), key)
 | 
			
		||||
 | 
			
		||||
        return ret
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
output = EuscanOutput(CONFIG)
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ def scan_upstream_urls(cpv, urls):
 | 
			
		||||
 | 
			
		||||
    for filename in urls:
 | 
			
		||||
        for url in urls[filename]:
 | 
			
		||||
            if not CONFIG['quiet']:
 | 
			
		||||
            if not CONFIG['quiet'] and not CONFIG['format']:
 | 
			
		||||
                pp.uprint()
 | 
			
		||||
            euscan.output.einfo("SRC_URI is '%s'" % url)
 | 
			
		||||
 | 
			
		||||
@@ -101,7 +101,7 @@ def scan_upstream(query):
 | 
			
		||||
        )
 | 
			
		||||
        return []
 | 
			
		||||
 | 
			
		||||
    if not CONFIG['quiet']:
 | 
			
		||||
    if not CONFIG['quiet'] and not CONFIG['format']:
 | 
			
		||||
        pp.uprint(
 | 
			
		||||
            " * %s [%s]" % (pp.cpv(pkg.cpv), pp.section(pkg.repo_name()))
 | 
			
		||||
        )
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user