Merge ~pieq/bugit/+git/qabro:master into bugit:master

Proposed by Pierre Equoy
Status: Merged
Approved by: Pierre Equoy
Approved revision: c3a9e17629c3988a7aad7b3d572a2351e5bf8326
Merged at revision: 6e11a700ae15d56fb301aa5bbbd085970637f35a
Proposed branch: ~pieq/bugit/+git/qabro:master
Merge into: bugit:master
Diff against target: 235 lines (+90/-22)
5 files modified
qabro/__init__.py (+15/-2)
qabro/__version__.py (+6/-0)
qabro/ui.py (+52/-10)
setup.py (+16/-9)
snap/snapcraft.yaml (+1/-1)
Reviewer Review Type Date Requested Status
Pierre Equoy Approve
Review via email: mp+347345@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Pierre Equoy (pieq) wrote :

Self-approve

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/qabro/__init__.py b/qabro/__init__.py
index ad140a0..fd63106 100644
--- a/qabro/__init__.py
+++ b/qabro/__init__.py
@@ -1,6 +1,6 @@
1#!usr/bin/env python1#!usr/bin/env python
22
3import os, sys3import logging, os, sys
4from time import sleep4from time import sleep
55
6from bug_assistant import BugAssistant6from bug_assistant import BugAssistant
@@ -8,6 +8,10 @@ from ui import ReportScreen
88
9def main():9def main():
10 if os.getenv('SUDO_USER'):10 if os.getenv('SUDO_USER'):
11 logging.basicConfig(filename='qabro.log',
12 format='%(asctime)s - %(levelname)s - %(message)s',
13 level=logging.ERROR
14 )
11 start_ui()15 start_ui()
12 else:16 else:
13 sys.exit("Please run this tool using sudo!")17 sys.exit("Please run this tool using sudo!")
@@ -20,9 +24,18 @@ def start_ui():
20 try: 24 try:
21 result = ba.file_bug()25 result = ba.file_bug()
22 except Exception as exc:26 except Exception as exc:
23 ui.message.set_text([('error', "Error: "), exc.message])27 logging.error(exc)
28 error_msg = ''
29 if hasattr(exc, 'content'):
30 error_msg = exc.content
31 else:
32 error_msg = exc.message
33 ui.message.set_text([('error', "Error: "), error_msg])
24 ui.run()34 ui.run()
25 ba.update(ui.report())35 ba.update(ui.report())
26 else:36 else:
27 print(result)37 print(result)
28 break38 break
39
40if __name__ == '__main__':
41 main()
diff --git a/qabro/__version__.py b/qabro/__version__.py
29new file mode 10064442new file mode 100644
index 0000000..e83815e
--- /dev/null
+++ b/qabro/__version__.py
@@ -0,0 +1,6 @@
1__title__ = 'qabro'
2__version__ = '0.4'
3__description__ = 'Report bug information with attachments in Launchpad'
4__author__ = 'Pierre Equoy'
5__author_email__ = 'pierre.equoy@canonical.com'
6__url__ = 'https://launchpad.net/qabro'
diff --git a/qabro/ui.py b/qabro/ui.py
index 80d0477..cdf2ec5 100644
--- a/qabro/ui.py
+++ b/qabro/ui.py
@@ -5,6 +5,7 @@ import sys
5import urwid5import urwid
66
7from bug_assistant import BugReport7from bug_assistant import BugReport
8from __version__ import __version__ as qversion, __title__ as qtitle
89
9class ReportScreen:10class ReportScreen:
10 palette = [11 palette = [
@@ -18,18 +19,37 @@ class ReportScreen:
18 ]19 ]
1920
20 footer_text = [21 footer_text = [
21 "Bug Report ",22 qtitle + ' v' + qversion + ' ',
22 ('key', "Alt-Enter"), " Submit ",23 ('key', "Alt-Enter"), " Submit ",
23 ('key', "Esc"), " Quit",24 ('key', "Esc"), " Quit",
24 ]25 ]
2526
26 statuses = ('New', 'Incomplete', 'Opinion', 'Confirmed')27 statuses = ('New', 'Confirmed')
27 importances = ('Undecided',28 importances = ('Undecided',
28 'Wishlist',29 'Wishlist',
29 'Low',30 'Low',
30 'Medium',31 'Medium',
31 'High',32 'High',
32 'Critical')33 'Critical')
34 bug_types = { "Audio": "hwe-audio",
35 "Bluetooth": "hwe-bluetooth",
36 "Camera": "oem-camera",
37 "External storage": "oem-storage",
38 "Touchpad": "hwe-touchpad",
39 "Touchscreen": "oem-touchscreen",
40 "Install": "hwe-installer",
41 "Media Card": "hwe-media",
42 "Networking (ethernet)": "hwe-networking-ethernet",
43 "Networking (wifi)": "hwe-networking-wifi",
44 "Networking (modem)": "hwe-networking-modem",
45 "Power management": "hwe-suspend-resume",
46 "Checkbox": "checkbox test-case",
47 "Video": "hwe-graphics",
48 "Hotkeys": "hwe-hotkeys",
49 "Firmware": "hwe-firmware",
50 "Missing driver": "hwe-needs-driver",
51 "Performance": "oem-performance",
52 "Other problem": "oem-other"}
3353
34 default_description = ("Summary:\n\n"54 default_description = ("Summary:\n\n"
35 "Steps to reproduce:\n\n"55 "Steps to reproduce:\n\n"
@@ -51,12 +71,14 @@ class ReportScreen:
51 self._importance = []71 self._importance = []
52 for i in self.importances:72 for i in self.importances:
53 rb = urwid.RadioButton(self._importance, i, 'first True', None)73 rb = urwid.RadioButton(self._importance, i, 'first True', None)
54 self._assignee = urwid.LineBox(urwid.Edit(), 'Assigned To')74 self._bug_type = []
75 for i in sorted(self.bug_types):
76 rb = urwid.RadioButton(self._bug_type, i, state=False, on_state_change=self.add_tag)
77 self._assignee = urwid.LineBox(urwid.Edit(), 'Assigned To (Launchpad ID)')
55 self._tags = urwid.LineBox(urwid.Edit(), 'Tags')78 self._tags = urwid.LineBox(urwid.Edit(), 'Tags')
56 self.cb_checkbox = urwid.CheckBox('Attach most recent Checkbox session (if any)')
57 self._options = urwid.LineBox(self.cb_checkbox, 'Options')
58 status_list = urwid.LineBox(urwid.Pile(self._status), 'Status')79 status_list = urwid.LineBox(urwid.Pile(self._status), 'Status')
59 importance_list = urwid.LineBox(urwid.Pile(self._importance), 'Importance')80 importance_list = urwid.LineBox(urwid.Pile(self._importance), 'Importance')
81 bug_types_list = urwid.LineBox(urwid.Pile(self._bug_type), 'Bug Type')
60 self.message = urwid.Text('')82 self.message = urwid.Text('')
61 self.footer = urwid.AttrMap(urwid.Text(self.footer_text), 'foot')83 self.footer = urwid.AttrMap(urwid.Text(self.footer_text), 'foot')
62 self.pile = urwid.Pile([self.message,84 self.pile = urwid.Pile([self.message,
@@ -68,13 +90,28 @@ class ReportScreen:
68 importance_list, 90 importance_list,
69 self._assignee, 91 self._assignee,
70 self._tags,92 self._tags,
71 self._options])93 bug_types_list])
72 self.view = urwid.Frame(urwid.Filler(self.pile, 'top'), footer=self.footer)94 self.view = urwid.Frame(urwid.Filler(self.pile, 'top'), footer=self.footer)
7395
96 def add_tag(self, rb, state):
97 if state:
98 # for the selected radio button
99 tag = self.bug_types[rb.label]
100 self._tags.base_widget.edit_text += ' ' + tag
101 else:
102 # for the previously selected radio button
103 tag = self.bug_types[rb.label]
104 self._tags.base_widget.edit_text = self._tags.base_widget.edit_text.replace(tag, '')
105 # clean up the list of tags to remove unwanted white spaces
106 self._tags.base_widget.edit_text = " ".join(self._tags.base_widget.edit_text.split())
107
74 def run(self):108 def run(self):
75 """Run the urwid MainLoop."""109 """Run the urwid MainLoop."""
76 self.loop = urwid.MainLoop(110 self.loop = urwid.MainLoop(self.view,
77 self.view, self.palette, unhandled_input=self.unhandled_input)111 self.palette,
112 handle_mouse=False,
113 unhandled_input=self.unhandled_input
114 )
78 self.loop.run()115 self.loop.run()
79116
80 def unhandled_input(self, key):117 def unhandled_input(self, key):
@@ -83,15 +120,20 @@ class ReportScreen:
83 sys.exit(0)120 sys.exit(0)
84 if key == 'meta enter':121 if key == 'meta enter':
85 raise urwid.ExitMainLoop()122 raise urwid.ExitMainLoop()
123 if key == 'page down':
124 self.loop.process_input(['down' for _ in range(5)])
125 if key == 'page up':
126 self.loop.process_input(['up' for _ in range(5)])
86127
87 def report(self):128 def report(self):
88 options = {'include_checkbox_session': self.cb_checkbox.state}129 tags = self._tags.base_widget.text
130 options = {'include_checkbox_session': 'checkbox' in tags}
89 return BugReport(title=self._title.base_widget.text,131 return BugReport(title=self._title.base_widget.text,
90 description=self._description.base_widget.text,132 description=self._description.base_widget.text,
91 project=self._project.base_widget.text,133 project=self._project.base_widget.text,
92 series=self._series.base_widget.text,134 series=self._series.base_widget.text,
93 assignee=self._assignee.base_widget.text,135 assignee=self._assignee.base_widget.text,
94 tags=self._tags.base_widget.text,136 tags=tags,
95 status=[rb.label for rb in self._status if rb.state][0],137 status=[rb.label for rb in self._status if rb.state][0],
96 importance=[rb.label for rb in self._importance if rb.state][0],138 importance=[rb.label for rb in self._importance if rb.state][0],
97 options=options139 options=options
diff --git a/setup.py b/setup.py
index 865cee9..db9e1e5 100644
--- a/setup.py
+++ b/setup.py
@@ -1,23 +1,30 @@
1#!/usr/bin/env python1#!/usr/bin/env python
22import os
3from codecs import open
3from setuptools import setup4from setuptools import setup
45
5package_name = 'qabro'6packages = ['qabro']
7
8here = os.path.abspath(os.path.dirname(__file__))
9
10about = {}
11with open(os.path.join(here, 'qabro', '__version__.py'), 'r', 'utf-8') as f:
12 exec(f.read(), about)
613
7setup(14setup(
8 name=package_name,15 name=about['__title__'],
9 version='0.2',16 version=about['__version__'],
10 description="Report bug information with attachments in Launchpad",17 description=about['__description__'],
11 long_description="""18 long_description="""
12qabro is a tool to report bugs against Launchpad projects and19qabro is a tool to report bugs against Launchpad projects and
13automatically attach relevent information to them (log files).20automatically attach relevent information to them (log files).
14""",21""",
15 packages=[package_name],22 packages=packages,
16 entry_points={23 entry_points={
17 'console_scripts': ['qabro = qabro.__init__:main']24 'console_scripts': ['qabro = qabro.__init__:main']
18 },25 },
19 author="Pierre Equoy",26 author=about['__author__'],
20 author_email="pierre.equoy@canonical.com",27 author_email=about['__author_email__'],
21 url='https://launchpad.net/qabro',28 url=about['__url__'],
22 license='License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',29 license='License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
23)30)
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index cecdaa0..5e8e93e 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -1,5 +1,5 @@
1name: qabro1name: qabro
2version: '0.3'2version: '0.4'
3summary: QA OEM bug reporting tool3summary: QA OEM bug reporting tool
4description: |4description: |
5 Tool to generate a Launchpad bug report and attach useful logs (using5 Tool to generate a Launchpad bug report and attach useful logs (using

Subscribers

People subscribed via source and target branches

to all changes: