Improved the test application.
This commit is contained in:
parent
be86c9df08
commit
c40eaa8981
1 changed files with 115 additions and 50 deletions
165
wizpym.py
165
wizpym.py
|
@ -1,4 +1,3 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# wizpym - The Wyzard Python Module, a tool to write Wizard-like apps.
|
||||
|
@ -17,9 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Requires Python 2.6 for with statements.
|
||||
# Requires Python 2.5 for etree in test panes.
|
||||
|
||||
"""A tool to write Wizard-like apps.
|
||||
|
||||
This module provides classes to easily build wizard-type applications
|
||||
|
@ -245,7 +241,6 @@ class ActivePane(Pane):
|
|||
it does nothing.
|
||||
"""
|
||||
if len(self._progress_box.get_children()):
|
||||
print '#Hide'
|
||||
gobject.idle_add(self._progress_box.remove,
|
||||
self._progress_box.get_children()[0])
|
||||
|
||||
|
@ -406,12 +401,10 @@ class AboutTestPane(Pane):
|
|||
|
||||
self.link_to(InputTestPane)
|
||||
|
||||
self.pack_start(gtk.Label('A simple search tool.'), True, True, 10)
|
||||
self.pack_start(
|
||||
gtk.Label('wizpym, Wizard Python Module v' + __version__),
|
||||
True, True, 10)
|
||||
self.pack_start(
|
||||
gtk.Label('Copyright 2010 David Soulayrol <david.soulayrol@gmail.com>'),
|
||||
False, False, 5)
|
||||
gtk.Label(
|
||||
'Copyright 2010 David Soulayrol <david.soulayrol@gmail.com>'), False)
|
||||
|
||||
comment = gtk.Label()
|
||||
comment.set_markup('This wizard tests the main features of wizpym, '
|
||||
|
@ -436,33 +429,77 @@ class InputTestPane(Pane):
|
|||
def __init__(self, frame):
|
||||
Pane.__init__(self, frame)
|
||||
|
||||
self.link_to(ActiveTestPane)
|
||||
self.link_to(FinalTestPane)
|
||||
self.set_header('Please select your kind of search and fill in criteria fields.')
|
||||
self.ready = False
|
||||
|
||||
self.link_to(GoogleSearchTestPane)
|
||||
self.link_to(LocalSearchTestPane)
|
||||
|
||||
frame = gtk.Frame('Kind of search:')
|
||||
frame.set_border_width(10)
|
||||
self.pack_start(frame, padding=10)
|
||||
vbox = gtk.VBox()
|
||||
frame.add(vbox)
|
||||
|
||||
button = gtk.RadioButton(None, 'Search Google Code')
|
||||
button.connect("toggled", self._on_button, ActiveTestPane)
|
||||
button.connect("toggled", self._on_button, GoogleSearchTestPane)
|
||||
button.set_active(True)
|
||||
self.pack_start(button, True, False)
|
||||
vbox.pack_start(button)
|
||||
|
||||
button = gtk.RadioButton(button, "Search Local Files")
|
||||
button.connect("toggled", self._on_button, LocalSearchTestPane)
|
||||
vbox.pack_start(button)
|
||||
|
||||
box = gtk.HBox(False, 10)
|
||||
self._entry = gtk.Entry()
|
||||
box.pack_start(gtk.Label('Keywords:'), False, False)
|
||||
box.pack_start(self._entry, True, True)
|
||||
self.pack_start(box, False, False)
|
||||
box.set_border_width(10)
|
||||
self._folder_entry = gtk.Entry()
|
||||
self._folder_entry.connect('changed', self._on_entry_update)
|
||||
box.pack_start(gtk.Label('Directory:'), False)
|
||||
box.pack_start(self._folder_entry)
|
||||
vbox.pack_start(box)
|
||||
|
||||
button = gtk.RadioButton(button, "Go to final pane")
|
||||
button.connect("toggled", self._on_button, FinalTestPane)
|
||||
self.pack_start(button, True, False)
|
||||
box = gtk.HBox(False, 10)
|
||||
box.set_border_width(10)
|
||||
self._keywords_entry = gtk.Entry()
|
||||
self._keywords_entry.connect('changed', self._on_entry_update)
|
||||
box.pack_start(gtk.Label('Keywords:'), False)
|
||||
box.pack_start(self._keywords_entry)
|
||||
self.pack_start(box)
|
||||
|
||||
self._update_status()
|
||||
|
||||
def leave(self):
|
||||
self.subject = self._entry.get_text()
|
||||
self.subject[0] = self._keywords_entry.get_text()
|
||||
self.subject[1] = self._folder_entry.get_text()
|
||||
|
||||
def _on_entry_update(self, w):
|
||||
self._update_status()
|
||||
|
||||
def _on_button(self, w, klass):
|
||||
if w.get_active():
|
||||
self.switch(klass)
|
||||
self._update_status()
|
||||
|
||||
def _update_status(self):
|
||||
r = len(self._keywords_entry.get_text())
|
||||
e = None if r else 'Please fill in the keywords field'
|
||||
|
||||
if isinstance(self.next(), LocalSearchTestPane):
|
||||
if not len(self._folder_entry.get_text()):
|
||||
r = False
|
||||
e = 'Local search needs a root folder'
|
||||
else:
|
||||
try:
|
||||
os.stat(self._folder_entry.get_text())
|
||||
except OSError:
|
||||
r = False
|
||||
e = self._folder_entry.get_text() + ' is not a valid path'
|
||||
|
||||
self.set_error(e)
|
||||
self.ready = r
|
||||
|
||||
|
||||
class ActiveTestPane(ActivePane):
|
||||
class GoogleSearchTestPane(ActivePane):
|
||||
PATH = 'https://www.google.com/codesearch/feeds/search?'
|
||||
XMLNS_ATOM = '{http://www.w3.org/2005/Atom}'
|
||||
XMLNS_GCS = '{http://schemas.google.com/codesearch/2006}'
|
||||
|
@ -470,17 +507,11 @@ class ActiveTestPane(ActivePane):
|
|||
def __init__(self, frame):
|
||||
ActivePane.__init__(self, frame)
|
||||
|
||||
self.link_to(FinalTestPane)
|
||||
|
||||
self._label = gtk.Label()
|
||||
self._label.set_line_wrap(True)
|
||||
self.pack_start(self._label, False, False)
|
||||
|
||||
self._inner_pane = gtk.VBox(False, 5)
|
||||
self.pack_start(self._inner_pane, True, True)
|
||||
|
||||
def enter(self):
|
||||
self._label.set_text('Searching for: "' + self.subject + '"')
|
||||
self.set_header('Google Code results for: "' + self.subject[0] + '"')
|
||||
|
||||
self.remove(self._inner_pane)
|
||||
self._inner_pane = gtk.VBox(False, 5)
|
||||
|
@ -491,23 +522,12 @@ class ActiveTestPane(ActivePane):
|
|||
|
||||
def _runner(self):
|
||||
timer = gobject.timeout_add(100, lambda: self.update_progress_bar())
|
||||
|
||||
self.update_progress_bar(text='Connecting...')
|
||||
c = httplib.HTTPSConnection('www.google.com')
|
||||
|
||||
self.update_progress_bar(text='Searching...')
|
||||
c.request(
|
||||
'GET', self.PATH + urllib.urlencode({'q': self.subject}),
|
||||
None, {'GData-Version': '2'})
|
||||
|
||||
# Simulate a longer task.
|
||||
gobject.source_remove(timer)
|
||||
self.update_progress_bar(0, 'Computing...')
|
||||
for i in range(100):
|
||||
self.update_progress_bar(i / 100.)
|
||||
time.sleep(.02)
|
||||
|
||||
c = httplib.HTTPSConnection('www.google.com')
|
||||
c.request('GET', self.PATH + urllib.urlencode({'q': self.subject[0]}),
|
||||
None, {'GData-Version': '2'})
|
||||
self.hide_progress_bar()
|
||||
gobject.source_remove(timer)
|
||||
gobject.idle_add(self._show_response, c.getresponse())
|
||||
|
||||
def _show_response(self, r):
|
||||
|
@ -527,17 +547,62 @@ class ActiveTestPane(ActivePane):
|
|||
self.pack_start(self._inner_pane, True, True)
|
||||
|
||||
|
||||
class FinalTestPane(Pane):
|
||||
class LocalSearchTestPane(ActivePane):
|
||||
def __init__(self, frame):
|
||||
Pane.__init__(self, frame)
|
||||
self.add(gtk.Label('Last Pane: no successor.'))
|
||||
ActivePane.__init__(self, frame)
|
||||
|
||||
sw = gtk.ScrolledWindow()
|
||||
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
textview = gtk.TextView()
|
||||
textview.set_editable(False)
|
||||
sw.add(textview)
|
||||
self.pack_start(sw)
|
||||
|
||||
self._buffer = textview.get_buffer()
|
||||
|
||||
def enter(self):
|
||||
self.set_header(
|
||||
'Grep results for: "' + self.subject[0].split()[0] + '" in ' + self.subject[1])
|
||||
|
||||
# Start thread
|
||||
ActivePane.enter(self)
|
||||
|
||||
def _runner(self):
|
||||
timer = gobject.timeout_add(100, lambda: self.update_progress_bar())
|
||||
self.update_progress_bar(0, 'Counting files...')
|
||||
nb_files = 0
|
||||
for root, dirs, files in os.walk('/home/david/src/opensips'):
|
||||
self._filter_directories(dirs)
|
||||
nb_files += len(files)
|
||||
gobject.source_remove(timer)
|
||||
|
||||
# Tweak so that the division below operates on floats.
|
||||
count = float(0)
|
||||
item = self.subject[0].split()[0]
|
||||
for root, dirs, files in os.walk('/home/david/src/opensips'):
|
||||
self._filter_directories(dirs)
|
||||
for f in files:
|
||||
name = os.path.join(root, f)
|
||||
p = subprocess.Popen(['grep', '-HnT', item, name],
|
||||
stdout=subprocess.PIPE)
|
||||
self._buffer.insert_at_cursor(p.communicate()[0])
|
||||
self.update_progress_bar(
|
||||
count / nb_files,
|
||||
name + '(' + str(int(count)) + '/' + str(nb_files) + ')')
|
||||
count += 1
|
||||
self.hide_progress_bar()
|
||||
|
||||
def _filter_directories(self, dirs):
|
||||
for f in ['CVS', '.svn', '.git']:
|
||||
if f in dirs:
|
||||
dirs.remove(f)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import httplib, urllib, time
|
||||
import httplib, os, subprocess, urllib
|
||||
import xml.etree.ElementTree as etree
|
||||
|
||||
gobject.threads_init()
|
||||
Frame(AboutTestPane).run()
|
||||
Frame(AboutTestPane, ['', '']).run()
|
||||
gtk.main()
|
||||
|
||||
|
|
Loading…
Reference in a new issue