Merge lp:~zyga/lava-dashboard-tool/prettier-data-set-renderer into lp:lava-dashboard-tool/linaro-11.05

Proposed by Zygmunt Krynicki
Status: Merged
Merged at revision: 136
Proposed branch: lp:~zyga/lava-dashboard-tool/prettier-data-set-renderer
Merge into: lp:lava-dashboard-tool/linaro-11.05
Diff against target: 156 lines (+50/-23)
1 file modified
launch_control_tool/commands/dashboard.py (+50/-23)
To merge this branch: bzr merge lp:~zyga/lava-dashboard-tool/prettier-data-set-renderer
Reviewer Review Type Date Requested Status
Zygmunt Krynicki Pending
Review via email: mp+59484@code.launchpad.net

Description of the change

A few tweaks to the way we render tabular data to make it easier to read.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'launch_control_tool/commands/dashboard.py'
2--- launch_control_tool/commands/dashboard.py 2011-04-29 00:20:42 +0000
3+++ launch_control_tool/commands/dashboard.py 2011-04-29 10:28:27 +0000
4@@ -65,7 +65,7 @@
5 is used to determine columns.
6 """
7 def __init__(self, column_map=None, row_formatter=None, empty=None,
8- order=None, caption=None, separator = " "):
9+ order=None, caption=None, separator = " ", header_separator=None):
10 if column_map is None:
11 column_map = {}
12 if row_formatter is None:
13@@ -78,6 +78,7 @@
14 self.order = order
15 self.separator = separator
16 self.caption = caption
17+ self.header_separator = header_separator
18
19 def _analyze_dataset(self, dataset):
20 """
21@@ -188,6 +189,13 @@
22 ... dataset, columns, maxlen)
23 a bee
24
25+ If you enable the header separator then column names will be visually
26+ separated from the first row of data.
27+ >>> DataSetRenderer(header_separator=True)._render_header(
28+ ... dataset, columns, maxlen)
29+ a bee
30+ -----------------
31+
32 If you provide a caption it gets rendered as a centered
33 underlined text before the data:
34 >>> DataSetRenderer(caption="Dataset")._render_header(
35@@ -196,6 +204,14 @@
36 =================
37 a bee
38
39+ You can use both caption and header separator
40+ >>> DataSetRenderer(caption="Dataset", header_separator=True)._render_header(
41+ ... dataset, columns, maxlen)
42+ Dataset
43+ =================
44+ a bee
45+ -----------------
46+
47 Observe how the total length of the output horizontal line
48 depends on the separator! Also note the columns labels are
49 aligned to the center of the column
50@@ -205,15 +221,20 @@
51 ===================
52 a | bee
53 """
54+ total_len = sum(maxlen.itervalues())
55+ if len(columns):
56+ total_len += len(self.separator) * (len(columns) - 1)
57+ # Print the caption
58 if self.caption:
59- total_len = sum(maxlen.itervalues())
60- if len(columns):
61- total_len += len(self.separator) * (len(columns) - 1)
62 print "{0:^{1}}".format(self.caption, total_len)
63 print "=" * total_len
64+ # Now print the coulum names
65 print self.separator.join([
66 "{0:^{1}}".format(self.column_map.get(column, column),
67 maxlen[column]) for column in columns])
68+ # Finally print the header separator
69+ if self.header_separator:
70+ print "-" * total_len
71
72 def _render_rows(self, dataset, columns, maxlen):
73 """
74@@ -540,24 +561,32 @@
75 super(deserialize, self).handle_xmlrpc_fault(faultCode, faultString)
76
77
78+
79+def _get_pretty_renderer(**kwargs):
80+ if "separator" not in kwargs:
81+ kwargs["separator"] = " | "
82+ if "header_separator" not in kwargs:
83+ kwargs["header_separator"] = True
84+ return DataSetRenderer(**kwargs)
85+
86+
87 class streams(XMLRPCCommand):
88 """
89 Show streams you have access to
90 """
91
92- renderer = DataSetRenderer(
93- order = ('pathname', 'bundle_count', 'name'),
94- column_map = {
95- 'pathname': 'Pathname',
96- 'bundle_count': 'Number of bundles',
97- 'name': 'Name'
98- },
99- row_formatter = {
100- 'name': lambda name: name or "(not set)"
101- },
102- empty = "There are no streams you can access on the server",
103- caption = "Bundle streams",
104- separator = " | ")
105+ renderer = _get_pretty_renderer(
106+ order = ('pathname', 'bundle_count', 'name'),
107+ column_map = {
108+ 'pathname': 'Pathname',
109+ 'bundle_count': 'Number of bundles',
110+ 'name': 'Name'
111+ },
112+ row_formatter = {
113+ 'name': lambda name: name or "(not set)"
114+ },
115+ empty = "There are no streams you can access on the server",
116+ caption = "Bundle streams")
117
118 def invoke_remote(self):
119 self.renderer.render(self.server.streams())
120@@ -568,7 +597,7 @@
121 Show bundles in the specified stream
122 """
123
124- renderer = DataSetRenderer(
125+ renderer = _get_pretty_renderer(
126 column_map = {
127 'uploaded_by': 'Uploader',
128 'uploaded_on': 'Upload date',
129@@ -780,15 +809,14 @@
130 """
131 Show data views defined on the server
132 """
133- renderer = DataSetRenderer(
134+ renderer = _get_pretty_renderer(
135 column_map = {
136 'name': 'Name',
137 'summary': 'Summary',
138 },
139 order = ('name', 'summary'),
140 empty = "There are no data views defined yet",
141- caption = "Data Views",
142- separator = " | ")
143+ caption = "Data Views")
144
145 def invoke_remote(self):
146 self._check_server_version(self.server, "0.4.0.dev")
147@@ -853,8 +881,7 @@
148 # Invoke the data view
149 response = self.server.query_data_view(self.args.data_view["name"], data_view_args)
150 # Create a pretty-printer
151- renderer = DataSetRenderer(
152- separator=" | ",
153+ renderer = _get_pretty_renderer(
154 caption=self.args.data_view["summary"],
155 order=[item["name"] for item in response["columns"]])
156 # Post-process the data so that it fits the printer

Subscribers

People subscribed via source and target branches

to all changes: