[dak/master] Allow json format for madison
Signed-off-by: Joerg Jaspert <joerg@debian.org>
---
daklib/ls.py | 36 ++++++++++++++++++++++++++++++++++++
dakweb/queries/madison.py | 15 +++++++++++----
2 files changed, 47 insertions(+), 4 deletions(-)
diff --git a/daklib/ls.py b/daklib/ls.py
index aeb8cfc..dacc23b 100644
--- a/daklib/ls.py
+++ b/daklib/ls.py
@@ -22,6 +22,8 @@ import sqlalchemy.sql as sql
import daklib.daksql as daksql
from daklib.dbconn import DBConn, session_wrapper
+from collections import defaultdict
+
@session_wrapper
def list_packages(packages, suites=None, components=None, architectures=None, binary_types=None,
@@ -72,6 +74,40 @@ def list_packages(packages, suites=None, components=None, architectures=None, bi
result = session.execute(query)
for row in result:
yield "{0} {1} {2}".format(row[t.c.package], row[t.c.version], row[t.c.architecture])
+ elif format == "python":
+ c_architectures = daksql.string_agg(t.c.architecture, ',', order_by=[t.c.architecture_is_source.desc(), t.c.architecture])
+ query = sql.select([t.c.package,
+ t.c.version,
+ t.c.display_suite,
+ c_architectures,
+ t.c.source,
+ t.c.source_version,
+ t.c.component]) \
+ .where(where) \
+ .group_by(t.c.package,
+ t.c.version,
+ t.c.display_suite,
+ t.c.source,
+ t.c.component,
+ t.c.source_version)
+ result = session.execute(query).fetchall()
+
+ if len(result) == 0:
+ raise StopIteration
+
+ val = lambda: defaultdict(val)
+ ret = val()
+ for row in result:
+ ret[row[t.c.package]] \
+ [row[t.c.display_suite]] \
+ [row[t.c.version]]={'component': row[t.c.component],
+ 'architectures': row[c_architectures].split(','),
+ 'source': row[t.c.source],
+ 'source_version': row[t.c.source_version]
+ }
+
+ yield ret
+ return
else:
raise ValueError("Unknown output format requested.")
diff --git a/dakweb/queries/madison.py b/dakweb/queries/madison.py
index d27d478..eb8c45c 100644
--- a/dakweb/queries/madison.py
+++ b/dakweb/queries/madison.py
@@ -24,12 +24,19 @@ def madison():
kwargs['source_and_binary'] = True
#if 'r' in r.query:
# kwargs['regex'] = True
+ format = r.query.get('f', None)
+ if format is not None:
+ kwargs['format'] = 'python'
result = list_packages(packages, **kwargs)
- bottle.response.content_type = 'text/plain'
- for row in result:
- yield row
- yield "\n"
+ if format is None:
+ bottle.response.content_type = 'text/plain'
+ for row in result:
+ yield row
+ yield "\n"
+ else:
+ yield json.dumps(list(result))
+
QueryRegister().register_path('/madison', madison)
--
1.7.10.4
Reply to: