Beispiel #1
0
 def get_labels(labels):
     for name in labels:
         try:
             c = config.str2label(name)
             yield c
         except config.UnknownLabel:
             pass
     return
Beispiel #2
0
 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))
Beispiel #3
0
 def get_labels(labels):
   for name in labels:
     try:
       c = config.str2label(name)
       yield c
     except config.UnknownLabel:
       pass
   return
Beispiel #4
0
 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))
Beispiel #5
0
 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
Beispiel #6
0
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)
Beispiel #7
0
 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)
Beispiel #8
0
 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)
Beispiel #9
0
 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(','))
Beispiel #10
0
 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(','))
Beispiel #11
0
    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)
Beispiel #12
0
  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)