def get_labels(labels): for name in labels: try: c = config.str2label(name) yield c except config.UnknownLabel: pass return
def __init__(self, args, labels=None): self.rules = [] if labels: try: labels = ''.join( str2label(x.strip()) for x in labels ) except KeyError, e: raise RuleSetSyntaxError('Unknown label: %s' % e) self.rules.append((lambda a,b:True, labels, False))
def add1(preds, s): if s.endswith('!'): terminate = True assign = s[:-1].split(',') else: terminate = False assign = s.split(',') try: assign = ''.join( str2label(x.strip()) for x in assign ) except KeyError, e: raise RuleSetSyntaxError('Unknown label: %s: line %d in %r' % (e, lineno, fname))
def __init__(self, labeldb, name, neg): Predicate.__init__(self) self.neg = neg label = config.str2label(name) if neg: self.q = '+!'+name else: self.q = '+'+name self.msgids = sorted(labeldb.get_msgids(label), reverse=True) self.curidx = 0 return
def LabelPredicate(neg, name): if name == '*': if neg: return (lambda msg, labels: not labels) else: return (lambda msg, labels: labels) try: label = str2label(name) except KeyError: raise PredicateSyntaxError('Unknown label: %s' % name) if neg: return (lambda msg, labels: label not in labels) else: return (lambda msg, labels: label in labels)
def cmd_label(self, args): 'usage: label [-q] [-R)eset] {+|+-}labels [msg]' try: (opts, args) = getopt(args, 'qR') except GetoptError: raise Kernel.ShowUsage() # reset = False verbose = 1 for (k, v) in opts: if k == '-q': verbose -= 1 elif k == '-R': reset = True # (docs, args) = self.get_messages(args) if not docs: (docs, _) = self.get_messages(['.']) if not docs: raise Kernel.SyntaxError('No message is specified.') label_add = set() label_del = set() for kw in args: if kw.startswith('!') or kw.startswith('-'): kw = kw[1:] neg = True elif kw.startswith('+-') or kw.startswith('+!'): kw = kw[2:] neg = True else: kw = kw[1:] neg = False try: label = config.str2label(kw) except config.UnknownLabel, e: raise Kernel.ValueError('Unknown label: %s' % e) if neg: label_del.add(label) else: label_add.add(label)
def cmd_label(self, args): 'usage: label [-q] [-R)eset] {+|+-}labels [msg]' try: (opts, args) = getopt(args, 'qR') except GetoptError: raise Kernel.ShowUsage() # reset = False verbose = 1 for (k,v) in opts: if k == '-q': verbose -= 1 elif k == '-R': reset = True # (docs, args) = self.get_messages(args) if not docs: (docs, _) = self.get_messages(['.']) if not docs: raise Kernel.SyntaxError('No message is specified.') label_add = set() label_del = set() for kw in args: if kw.startswith('!') or kw.startswith('-'): kw = kw[1:] neg = True elif kw.startswith('+-') or kw.startswith('+!'): kw = kw[2:] neg = True else: kw = kw[1:] neg = False try: label = config.str2label(kw) except config.UnknownLabel, e: raise Kernel.ValueError('Unknown label: %s' % e) if neg: label_del.add(label) else: label_add.add(label)
def cmd_comp(self, args): 'usage: comp [-g)roup] [-r)eply] [-F)orward] [-s subject] [+label] [msg:part] addrs ...' try: (opts, args) = getopt(args, 'grFs:') except GetoptError: raise Kernel.ShowUsage() # group = False reply = False forward = False subject = u'' labels = config.LABEL4DRAFT for (k, v) in opts: if k == '-g': group = True elif k == '-r': reply = True elif k == '-F': forward = True elif k == '-s': subject = v if (forward or reply) and not args: args = ['.'] elif not args: raise Kernel.ShowUsage() # Setup a template text. # First, get recipient addresses. (addrs_to, addrs_cc, addrs_bcc) = ([], [], []) try: (docs, args) = self.get_messages(args) except Kernel.ValueError: docs = [] for arg in args: if arg.startswith('+'): try: labels = config.str2label(arg[1:]) except config.UnknownLabel, e: raise Kernel.ValueError('Unknown label: %s' % e) elif arg.startswith('to:'): addrs_to.extend(arg[3:].split(','))
def cmd_comp(self, args): 'usage: comp [-g)roup] [-r)eply] [-F)orward] [-s subject] [+label] [msg:part] addrs ...' try: (opts, args) = getopt(args, 'grFs:') except GetoptError: raise Kernel.ShowUsage() # group = False reply = False forward = False subject = u'' labels = config.LABEL4DRAFT for (k,v) in opts: if k == '-g': group = True elif k == '-r': reply = True elif k == '-F': forward = True elif k == '-s': subject = v if (forward or reply) and not args: args = ['.'] elif not args: raise Kernel.ShowUsage() # Setup a template text. # First, get recipient addresses. (addrs_to, addrs_cc, addrs_bcc) = ([], [], []) try: (docs, args) = self.get_messages(args) except Kernel.ValueError: docs = [] for arg in args: if arg.startswith('+'): try: labels = config.str2label(arg[1:]) except config.UnknownLabel, e: raise Kernel.ValueError('Unknown label: %s' % e) elif arg.startswith('to:'): addrs_to.extend(arg[3:].split(','))
def cmd_scan(self, args): 'usage: scan [-q] [-n nmsgs] [-S selection] [-a)ll] [-P)rev|-N)ext|-R)eset] [-O)r] predicates ...' try: (opts, args) = getopt(args, 'qn:S:aPNRO') except GetoptError: raise Kernel.ShowUsage() # Get command line options. verbose = 1 nmsgs = config.SCAN_DEFAULT_MSGS selection = 0 disjunctive = False search_all = False rel = 0 for (k, v) in opts: if k == '-q': verbose -= 1 elif k == '-n': nmsgs = Kernel.safeint(v) elif k == '-S': selection = Kernel.safeint(v) elif k == '-a': search_all = True if not args: args = ['all'] elif k == '-N': rel = 1 elif k == '-P': rel = -1 elif k == '-R': rel = -2 elif k == '-O': disjunctive = True if not args: # No query - use the previous result. # (argument omitted and the previous selection is saved.) selection = self.get_selection(selection) selection.slide_window(rel, nmsgs) corpus = selection.get_corpus() else: corpus = self.get_corpus() # Query specified. # Create an appropriate selection. if args == ['all'] or args == ['a']: # scan all the messages. if search_all: selection = MailSelection(corpus, [], window_size=nmsgs) else: selection = MailSelection(corpus, [], doc_preds=[DEFAULT_FILTER], window_size=nmsgs) else: # scan "something" terms = [] label_preds = [] doc_preds = [DEFAULT_FILTER] for kw in args: if not kw: continue if kw[0] != '+': terms.append(kw) continue kw = kw[1:] if not kw: raise Kernel.SyntaxError('Invalid label spec.') try: if kw[0] in '!-': pred = LabelPredicate(corpus.get_labeldb(), kw[1:], True) else: pred = LabelPredicate(corpus.get_labeldb(), kw, False) if config.str2label(kw) in config.FILTERED_LABELS: doc_preds = [] except config.UnknownLabel, e: raise Kernel.ValueError('Unknown label: %s' % e) label_preds.append(pred) term_preds = [EMailPredicate(kw) for kw in terms] # Automatic query expansion. def forall(pred, seq): for x in seq: if not pred(x): return False return True if len(terms) == 1 and terms[0].isalpha() and canbe_yomi( terms[0]) and not label_preds: term_preds = [ YomiEMailPredicate(terms[0]), EMailPredicate(terms[0]) ] disjunctive = True elif forall(canbe_yomi, terms): term_preds = [YomiEMailPredicate(kw) for kw in terms] else: def stripdot(x): if x.startswith('.'): return x[1:] return x term_preds = [EMailPredicate(stripdot(kw)) for kw in terms] if search_all: doc_preds = [] selection = MailSelection(corpus, term_preds + label_preds, doc_preds, disjunctive=disjunctive, window_size=nmsgs)
def cmd_scan(self, args): 'usage: scan [-q] [-n nmsgs] [-S selection] [-a)ll] [-P)rev|-N)ext|-R)eset] [-O)r] predicates ...' try: (opts, args) = getopt(args, 'qn:S:aPNRO') except GetoptError: raise Kernel.ShowUsage() # Get command line options. verbose = 1 nmsgs = config.SCAN_DEFAULT_MSGS selection = 0 disjunctive = False search_all = False rel = 0 for (k,v) in opts: if k == '-q': verbose -= 1 elif k == '-n': nmsgs = Kernel.safeint(v) elif k == '-S': selection = Kernel.safeint(v) elif k == '-a': search_all = True if not args: args = ['all'] elif k == '-N': rel = 1 elif k == '-P': rel = -1 elif k == '-R': rel = -2 elif k == '-O': disjunctive = True if not args: # No query - use the previous result. # (argument omitted and the previous selection is saved.) selection = self.get_selection(selection) selection.slide_window(rel, nmsgs) corpus = selection.get_corpus() else: corpus = self.get_corpus() # Query specified. # Create an appropriate selection. if args == ['all'] or args == ['a']: # scan all the messages. if search_all: selection = MailSelection(corpus, [], window_size=nmsgs) else: selection = MailSelection(corpus, [], doc_preds=[ DEFAULT_FILTER ], window_size=nmsgs) else: # scan "something" terms = [] label_preds = [] doc_preds = [ DEFAULT_FILTER ] for kw in args: if not kw: continue if kw[0] != '+': terms.append(kw) continue kw = kw[1:] if not kw: raise Kernel.SyntaxError('Invalid label spec.') try: if kw[0] in '!-': pred = LabelPredicate(corpus.get_labeldb(), kw[1:], True) else: pred = LabelPredicate(corpus.get_labeldb(), kw, False) if config.str2label(kw) in config.FILTERED_LABELS: doc_preds = [] except config.UnknownLabel, e: raise Kernel.ValueError('Unknown label: %s' % e) label_preds.append(pred) term_preds = [ EMailPredicate(kw) for kw in terms ] # Automatic query expansion. def forall(pred, seq): for x in seq: if not pred(x): return False return True if len(terms) == 1 and terms[0].isalpha() and canbe_yomi(terms[0]) and not label_preds: term_preds = [ YomiEMailPredicate(terms[0]), EMailPredicate(terms[0]) ] disjunctive = True elif forall(canbe_yomi, terms): term_preds = [ YomiEMailPredicate(kw) for kw in terms ] else: def stripdot(x): if x.startswith('.'): return x[1:] return x term_preds = [ EMailPredicate(stripdot(kw)) for kw in terms ] if search_all: doc_preds = [] selection = MailSelection(corpus, term_preds+label_preds, doc_preds, disjunctive=disjunctive, window_size=nmsgs)