Example #1
0
 def test_process_books(self):
     converters = [pipe_to_book, slash_to_book, csv_to_book]
     file_parse_info = zip(get_input_files(), ["|", "/", ","], converters)
     books = get_books_from_files(file_parse_info)
     self.assertEquals(len(process_books(books, "", False, False)), 9)
     books = get_books_from_files(file_parse_info)
     self.assertEquals(process_books(books, None, False, False)[0],
                       Book("Kent", "Beck", "Implementation Patterns",
                            "2007"))
     books = get_books_from_files(file_parse_info)
     self.assertEquals(process_books(books, None, False, True)[-1],
                       Book("Kent", "Beck", "Implementation Patterns",
                            "2007"))
     books = get_books_from_files(file_parse_info)
     self.assertEquals(process_books(books, None, True, False)[0],
                       Book("Fred", "Brooks", "The Mythical Man-Month",
                            "1975"))
Example #2
0
 def get_or_create(cls, queries, *args, **kwargs):
     item = Book.get_by_queries(**queries)
     if not item:
         item = Book(*args, **kwargs)
         item.save()
     return item
Example #3
0
class __init__():
    def __init__(self, bot):
        
        self.icons = {}
        
        self.queue = []
        self.delay = 0

        self.menu = {}
        self.menu_count = 1
        
        self.req = {'enabled': False}
        self.bot = bot

        self.bot.events.add('ui', 0, 0,
                            'load', self.load_gui)

        if self.bot.ui_loaded:
            wx.CallAfter(self.load_gui)

    def load_gui(self):
        self.wrapper = self.bot.wrapper.wx
        self.bni = self.wrapper.load_library('bni', bni)
        
        #GUI - START
        self.frame = wx.Frame(None, wx.ID_ANY, self.bot.ver(), size=(800, 450))
        self.panel = wx.Panel(self.frame)

        #TASK BAR ICON
        self.tray_icon = wx.Icon('icons' + sep + 'tray_icon.gif', wx.BITMAP_TYPE_GIF)
        self.tb_icon = wx.TaskBarIcon()

        self.frame.Bind(wx.EVT_ICONIZE, self.create_icon)
        self.tb_icon.Bind(wx.EVT_TASKBAR_LEFT_UP, self.remove_icon)

        self.frame.SetIcon(self.tray_icon)

        #MENU BAR
        self.menu_bar = wx.MenuBar()
        self.frame.SetMenuBar(self.menu_bar)

        #CHAT BOX, SEND BOX, CHANNEL HEADER
        self.nb_disp = Book('disp', self.bot, self, self.panel,
                            wx.aui.AUI_NB_WINDOWLIST_BUTTON |\
                            wx.aui.AUI_NB_CLOSE_BUTTON |\
                            wx.aui.AUI_NB_CLOSE_ON_ALL_TABS |\
                            wx.aui.AUI_NB_SCROLL_BUTTONS)

        self.txt_chat()
        self.bot.events.add(self, 'ui', 'disp', 'closed', 0, 0,
                            'main', self.txt_chat)
        
        self.cb_send = wx.ComboBox(self.panel, style=wx.CB_DROPDOWN |\
                                   wx.TE_PROCESS_ENTER)
        self.frame.Bind(wx.EVT_TEXT_ENTER, self.send_text, self.cb_send)
        self.frame.Bind(wx.EVT_TEXT_PASTE, self.text_pasted, self.cb_send)

        #CHANNEL LIST
        self.nb_list = Book('list', self.bot, self, self.panel,
                            wx.aui.AUI_NB_WINDOWLIST_BUTTON |\
                            wx.aui.AUI_NB_BOTTOM |\
                            wx.aui.AUI_NB_SCROLL_BUTTONS)

        #COLOURS - Inherit doesn't work for me ;(
        self.cb_send.SetBackgroundColour('#000000')
        self.cb_send.SetForegroundColour('#FFFFFF') 

        #SIZING / POSITIONING
        self.grid = wx.GridBagSizer()
        self.grid.Add(self.cb_send, wx.GBPosition(1, 0), flag=wx.EXPAND)
        self.grid.Add(self.nb_list.book, wx.GBPosition(0, 1),
                      flag=wx.EXPAND,
                      span=wx.GBSpan(2, 1))
        self.grid.Add(self.nb_disp.book, wx.GBPosition(0, 0), flag=wx.EXPAND)

        #SIZING - RESIZING
        self.grid.AddGrowableCol(0, 1)
        self.grid.AddGrowableRow(0, 1)
        self.grid.SetFlexibleDirection(wx.BOTH)

        #SIZING - MINIMUMS
        self.nb_disp.book.SetSizeHints(1, 1)
        self.nb_list.book.SetSizeHints(300, 1)
 
        #GET READY
        self.panel.SetSizerAndFit(self.grid, True)
        self.frame.Show(True)

        self.add_events()

        #ADDCHAT READY
        self.bot.addchat(self.bot.ver())

        self.bot.events.call('ui', 'start')
        self.menu_add('Window',
                      'Clear current display(s)\tCTRL-S', self.clear_chat)

        if self.bot.ui_loaded:
            self.bot.events.call('ui', 'reload')
        
        self.cb_send.SetFocus()

    def txt_chat(self, name=''):
        self.nb_disp.page_add('disp', 'main', 'Main')

    def text_pasted(self, event):
        if wx.TheClipboard.Open():
            if wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_TEXT)):
                data = wx.TextDataObject()
                wx.TheClipboard.GetData(data)
                msg = str(data.GetText())

                if msg.find('\n') == -1:
                    event.Skip(True)
                else:
                    for line in msg.split('\n'):
                        line = line.strip('\n\r')
                        if line != '':
                            self.bot.send(line)
                            self.cb_send.Insert(line, 0)

            wx.TheClipboard.Close()

    def menu_add(self, *rest):
        wx.CallAfter(self.do_menu_add, *rest)

    def do_menu_add(self, menu, *rest):
        key = menu.lower()
        if (key in self.menu) == False:
            self.menu[key] = (wx.Menu(), self.menu_bar.GetMenuCount())
            self.menu_bar.Append(self.menu[key][0], menu)

        for x in range(0, len(rest), 2):
            mi = wx.MenuItem(self.menu[key][0], self.menu_count,
                             rest[x])
            self.menu[key][0].AppendItem(mi)
            wx.EVT_MENU(self.frame, self.menu_count, rest[x+1])
            self.menu_count += 1

    def menu_remove(self, menu):
        try:
            self.menu_bar.Remove(self.menu[menu][1])
            self.menu[menu][0].Destroy()
            del self.menu[menu]
        except KeyError:
            pass
        
    def add_events(self):
        self.bot.events.add(self, 'IO', -1, -1,
                            'addchat', self.main_addchat,
                            'input', self.req_input)

        self.bot.events.add(self, 'ui', 'menu', 0, 0,
                            'add', self.menu_add,
                            'remove', self.menu_remove)

        self.bot.events.add(self, 'ui', 0, 0,
                            'config', self.show_config,
                            'confirm', self.confirm,
                            'get_profile', self.request_profile)

        self.bot.events.add(self, 'ui', 'send', 0, 0,
                            'send', self.send_send,
                            'clear', self.clear_send)

        self.bot.events.add(self, 'profile', 0, 0,
                            'received', self.got_profile)

    def load_icons(self, x=28, y=14, **kwargs):
        if kwargs == {}:
            il = self.bni.il
            icons = None
            count = self.bni.count
            
        else:        
            il = wx.ImageList(x, y)
            icons = {}
            count = 0
            for k, v in kwargs.iteritems():
                icons[k] = il.Add(wx.Bitmap(v))
                count += 1
                
        return icons, il, count

    def get_lag_idx(self, arg):
        ping, flags = arg
        if (flags & 0x10) == 0x10:
            return self.bni.legacy[49]['idx']
        elif ping <= 0:
            return self.bni.legacy[42]['idx']
        elif ping < 200:
            return self.bni.legacy[43]['idx']
        elif ping > 700:
            return self.bni.legacy[48]['idx']
        else:
            return self.bni.legacy[ping / 100 + 42]['idx']

    def get_bni_idx(self, user, draw):
        il = self.bni.il
        try:
            icon = user['icon'][-4:] or user['product'][-4:]
        except KeyError:
            icon = user['product'][-4:]
        flags = user['flags']

        idx = -1
        for x in self.bni.flag:
            if (flags & x['flags']) == x['flags']:
                idx = x['idx']
                return idx

        if (icon in ['STAR', 'SEXP', 'SSHR', 'JSTR']):
            try:
                if user['ladder_rank'] != 0:
                    if user['ladder_rank'] == 1:
                        idx = self.bni.legacy[13]['idx']
                    else:
                        idx = self.bni.legacy[12]['idx']
                elif user['ladder_rating'] != 0:
                    idx = self.bni.legacy[11]['idx']
                elif user['wins'] > 0:
                    idx = ((user['wins'] > 10) and 10) or\
                            user['wins']
                    idx = self.bni.legacy[idx]['idx']
                    return idx
            except KeyError:
                pass

        elif icon == 'W2BN':
            try:
                if user['ladder_rank'] != 0:
                    if user['ladder_rank'] == 1:
                        idx = self.bni.legacy[28]['idx']
                    else:
                        idx = self.bni.legacy[26]['idx']
                elif user['ladder_rating'] != 0:
                    idx = self.bni.legacy[25]['idx']
                elif user['wins'] > 0:
                    idx = (((user['wins'] > 10) and 10) or\
                            user['wins']) + 14
                    return idx
            except KeyError:
                pass
                
        elif icon in ['DRTL', 'DSHR']:
            try:
                if user['class_num'] != -1:
                    idx = 30 + user['class_num'] + 3 * user['dots']
            except KeyError:
                pass
        elif user['product'] in ['WAR3', 'W3XP']:
            try:
                if user['level'] == 0:
                        icon = user['product'] #Override to more specific icon
            except KeyError:
                icon = user['product']
        if idx == -1:
            try:
                idx = self.bni.prod[icon]['idx']
            except KeyError:
                return -1

        if 'level' in user:
            if user['level'] == 0:
                return idx
            bitm = il.GetBitmap(idx)
            mdc = wx.MemoryDC(bitm)
            mdc.SetTextForeground('#3399FF')
            font = wx.Font(6, wx.FONTFAMILY_ROMAN,
                           wx.FONTSTYLE_NORMAL,
                           wx.FONTWEIGHT_NORMAL)
            mdc.SetFont(font)
            if user['product'] in ['WAR3', 'W3XP']:
                mdc.DrawText(str(user['level']), 22, 3)
            elif user['product'] in ['DRTL', 'DSHR']:
                mdc.DrawText(str(user['level']), 16, 3)
            elif user['product'] in ['D2DV', 'D2XP']:
                mdc.DrawText(str(user['level']), 16, 3)

            mdc.SelectObjectAsSource(wx.NullBitmap)
            idx = self.bni.add(bitm)
            draw.append(idx)
            return idx

        if 'ladder_rating' in user:
            if user['ladder_rating'] == 0:
                return idx

            bitm = il.GetBitmap(idx)
            mdc = wx.MemoryDC(bitm)
            font = wx.Font(6, wx.FONTFAMILY_ROMAN,
                               wx.FONTSTYLE_NORMAL,
                               wx.FONTWEIGHT_NORMAL)
            mdc.SetFont(font)
            mdc.SetTextForeground('#FFFFFF')
            mdc.DrawText(str(user['ladder_rating']), 5, 3)
            #if user['ladder_rank'] != 0:
            #    mdc.SetTextForeground('#3399FF')
            #    mdc.DrawText(str(user['ladder_rank']), 26, 10)
            #Not enough space anymore
            mdc.SelectObjectAsSource(wx.NullBitmap)
                
            idx = self.bni.add(bitm)
            draw.append(idx)
            return idx

        return idx

    def notify_tab(self, msg):
        idx, name, kind = self.nb_disp.page_current()
        keep = [name, msg]
        self.bot.events.call('ui', kind, name, 'send', [keep])
        msg = keep[1]

        idx, name, kind = self.nb_list.page_current()
        keep = [name, msg]
        self.bot.events.call('ui', kind, name, 'send', [keep])

        return keep[1]

    def confirm(self, title, msg, func_yes, func_no=None):
        md = wx.MessageDialog(self.panel, msg, title, wx.YES_NO | wx.ICON_QUESTION)
        if md.ShowModal() == wx.ID_YES:
            func_yes()
        else:
            if func_no != None:
                func_no()

    def create_icon(self, evt_icon):
        if evt_icon.Iconized():
            self.tb_icon.SetIcon(self.tray_icon)
            self.frame.Lower()
            self.frame.Show(False)
        
    def remove_icon(self, *rest):
        self.tb_icon.RemoveIcon()
        self.frame.Restore()
        self.frame.Raise()
        self.frame.Show(True)

    def send_send(self, pre='', post='', clear=True):
        self.cb_send.SetValue(str(self.cb_send.GetValue()))
        self.send_text(clear=clear, pre=pre, post=post)

    def request_profile(self, names):
        self.bot.events.call('profile', 'request', name)
        
    def got_profile(self, names, results):
        wx.CallAfter(self.got_profile2,
                     names,
                     results)

    def got_profile2(self, name, keys):
        self.nb_disp.page_add('profile', 'prof_'+name, 'Profile: ' + name,
                              name, keys, select=True)
            
    def req_input(self, req):
        self.bot.addchat('info', req['query'])
        self.req = req
        self.req['enabled'] = True

    def show_config(self, *rest):
        self.config = Config(self.bot)

    def clear_chat(self, cmd=None):
        idx, name, kind = self.nb_disp.page_current()
        if kind == 'disp':
            self.bot.events.call('ui', kind, name, 'clear')

        idx, name, kind = self.nb_list.page_current()
        if kind == 'disp':
            self.bot.events.call('ui', kind, name, 'clear')
        
    def send_text(self, wtf=0, clear=True, pre='', post=''):
        msg = pre+str(self.cb_send.GetValue())+post
        if msg == '':
            return

        if self.req['enabled'] == False:
            msg = self.notify_tab(msg)
            self.bot.send(msg)
        else:
            self.req['enabled'] = False #Can't delete req dict. ret_func disappears
            self.req['ret_func'](msg)

        if clear == True:
            self.clear_send()
        self.cb_send.Insert(msg, 0)

    def clear_send(self):
        self.cb_send.SetValue('')

    def main_addchat(self, *args):
        self.bot.events.call('ui', 'disp', 'main', 'append', list(args))

    def __del__(self, *rest):
        self.frame.Destroy()
Example #4
0
    def load_gui(self):
        self.wrapper = self.bot.wrapper.wx
        self.bni = self.wrapper.load_library('bni', bni)
        
        #GUI - START
        self.frame = wx.Frame(None, wx.ID_ANY, self.bot.ver(), size=(800, 450))
        self.panel = wx.Panel(self.frame)

        #TASK BAR ICON
        self.tray_icon = wx.Icon('icons' + sep + 'tray_icon.gif', wx.BITMAP_TYPE_GIF)
        self.tb_icon = wx.TaskBarIcon()

        self.frame.Bind(wx.EVT_ICONIZE, self.create_icon)
        self.tb_icon.Bind(wx.EVT_TASKBAR_LEFT_UP, self.remove_icon)

        self.frame.SetIcon(self.tray_icon)

        #MENU BAR
        self.menu_bar = wx.MenuBar()
        self.frame.SetMenuBar(self.menu_bar)

        #CHAT BOX, SEND BOX, CHANNEL HEADER
        self.nb_disp = Book('disp', self.bot, self, self.panel,
                            wx.aui.AUI_NB_WINDOWLIST_BUTTON |\
                            wx.aui.AUI_NB_CLOSE_BUTTON |\
                            wx.aui.AUI_NB_CLOSE_ON_ALL_TABS |\
                            wx.aui.AUI_NB_SCROLL_BUTTONS)

        self.txt_chat()
        self.bot.events.add(self, 'ui', 'disp', 'closed', 0, 0,
                            'main', self.txt_chat)
        
        self.cb_send = wx.ComboBox(self.panel, style=wx.CB_DROPDOWN |\
                                   wx.TE_PROCESS_ENTER)
        self.frame.Bind(wx.EVT_TEXT_ENTER, self.send_text, self.cb_send)
        self.frame.Bind(wx.EVT_TEXT_PASTE, self.text_pasted, self.cb_send)

        #CHANNEL LIST
        self.nb_list = Book('list', self.bot, self, self.panel,
                            wx.aui.AUI_NB_WINDOWLIST_BUTTON |\
                            wx.aui.AUI_NB_BOTTOM |\
                            wx.aui.AUI_NB_SCROLL_BUTTONS)

        #COLOURS - Inherit doesn't work for me ;(
        self.cb_send.SetBackgroundColour('#000000')
        self.cb_send.SetForegroundColour('#FFFFFF') 

        #SIZING / POSITIONING
        self.grid = wx.GridBagSizer()
        self.grid.Add(self.cb_send, wx.GBPosition(1, 0), flag=wx.EXPAND)
        self.grid.Add(self.nb_list.book, wx.GBPosition(0, 1),
                      flag=wx.EXPAND,
                      span=wx.GBSpan(2, 1))
        self.grid.Add(self.nb_disp.book, wx.GBPosition(0, 0), flag=wx.EXPAND)

        #SIZING - RESIZING
        self.grid.AddGrowableCol(0, 1)
        self.grid.AddGrowableRow(0, 1)
        self.grid.SetFlexibleDirection(wx.BOTH)

        #SIZING - MINIMUMS
        self.nb_disp.book.SetSizeHints(1, 1)
        self.nb_list.book.SetSizeHints(300, 1)
 
        #GET READY
        self.panel.SetSizerAndFit(self.grid, True)
        self.frame.Show(True)

        self.add_events()

        #ADDCHAT READY
        self.bot.addchat(self.bot.ver())

        self.bot.events.call('ui', 'start')
        self.menu_add('Window',
                      'Clear current display(s)\tCTRL-S', self.clear_chat)

        if self.bot.ui_loaded:
            self.bot.events.call('ui', 'reload')
        
        self.cb_send.SetFocus()