Ejemplo n.º 1
0
 def unschedule_all_r(self):
     logging.info('Removing reminders of {}'.format(
         os.path.basename(self.path)))
     if self.reminders:
         for r_obj in self.reminders:
             logging.debug('    ' + str(r_obj))
             ev.send('schedule', request='remove', r_obj=r_obj)
Ejemplo n.º 2
0
    def timer(self):
        while True:
            while not self.r_heap:
                time.sleep(1)
                logging.debug('Waiting for upcoming reminders.')

            next_r_obj = self.r_heap[0]
            till = next_r_obj.in_sec
            ev.send('timer started', r_obj=next_r_obj)
            logging.debug('Next reminder at {}.'.format(next_r_obj.time_dt))

            while True:
                if not self.r_heap or next_r_obj is not self.r_heap[0]:
                    logging.debug('Next reminder changed. Restarting timer.')
                    break

                logging.debug('Time until reminder: {}'.format(till -
                                                               time.time()))

                if till - time.time() > 0:
                    time.sleep(1)
                else:
                    with self.lock:
                        heapq.heappop(self.r_heap)
                    ev.send('alarm', r_obj=next_r_obj)
                    if next_r_obj.is_recurring:
                        pass  # TODO
                    break
Ejemplo n.º 3
0
def scan_fs(scan_path, cfg):
    now_dt = datetime.datetime.today()
    if os.path.isfile(scan_path):
        File(scan_path, cfg).parse(now_dt)
    else:
        for root, subdirs, files in os.walk(scan_path):
            for file_path in files:
                if file_path.endswith(cfg.text_files_ext_list) and \
                        os.path.getsize(root + os.sep + file_path) < cfg.file_size_limit:
                    file = new_file(root + os.sep + file_path, cfg)
                    file.parse(now_dt)

    ev.send('scan complete')
Ejemplo n.º 4
0
 def process_events(self):
     while True:
         event = self.event_q.get()
         with self.lock:
             if event.request == 'add':
                 heapq.heappush(self.r_heap, event.r_obj)
                 logging.debug('Scheduled {}'.format(event.r_obj))
             elif event.request == 'remove':
                 try:
                     self.r_heap.remove(event.r_obj)
                 except ValueError:
                     pass
             elif event.request == 'lists':
                 ev.send('lists', data=heapq.nsmallest(10, self.r_heap))
Ejemplo n.º 5
0
    def run(self):
        broken_r_list = []
        got_list = None

        while True:
            if not got_list and self.event_q.empty():  # Show list once, after resolving all reminders
                ev.send('schedule', request='lists')

            got_list = False

            event = self.event_q.get()

            if event.type == 'timer started':
                print('\nTimer started. Next reminder at {}.'.format(event.r_obj.time_dt))
            elif event.type == 'invalid r tag':
                broken_r_list.append(event.data)
            elif event.type == 'lists':
                print_r_list(event.data, broken_r_list)
                broken_r_list = []
                got_list = True
            elif event.type == 'alarm':
                handle_alarm(event.r_obj)
Ejemplo n.º 6
0
    def parse(self, now_dt):
        self.reminders = []
        new_lines_list = []
        text_is_altered = False
        in_r_block = False
        logging.info('Adding reminders of {}'.format(
            os.path.basename(self.path)))

        with open(self.path, 'r') as file:
            for line in file:
                if line[0:len(self.cfg.r_block_start_marker
                              )] == self.cfg.r_block_start_marker:
                    in_r_block = True
                    new_lines_list.append(line)
                    continue
                elif in_r_block and not self.cfg.allow_empty_r_tags_in_r_block and not line.strip(
                ):
                    new_lines_list.append(line)
                    continue
                elif line[0:len(self.cfg.r_block_end_marker
                                )] == self.cfg.r_block_end_marker:
                    in_r_block = False
                    new_lines_list.append(line)
                    continue
                elif not in_r_block and self.cfg.r_tag_marker not in line:
                    new_lines_list.append(line)
                    continue

                if in_r_block:
                    r_tags = line,  # creates a tuple
                else:
                    r_tags = [
                        ''.join((self.cfg.r_tag_marker, tag))
                        for tag in line.split(self.cfg.r_tag_marker)[1:]
                    ]

                for r_tag in r_tags:
                    try:
                        r_tag = ' '.join(
                            r_tag.split(' ')[:self.cfg.max_words_in_r_tag])
                        r_obj = Reminder(r_tag, self, self.cfg, now_dt,
                                         in_r_block)
                        self.reminders.append(r_obj)

                        if r_tag != r_obj.r_tag:
                            line = line.replace(r_tag, r_obj.r_tag, 1)
                            text_is_altered = True

                    except ValueError:
                        ev.send('invalid r tag', data=r_tag)

                new_lines_list.append(line)

        logging.info(os.path.basename(self.path) + ' parsed')

        if text_is_altered:
            self.last_mtime = 'now'
            with open(self.path, 'w') as file:
                file.write(''.join(new_lines_list))
                logging.info(
                    os.path.basename(self.path) + ' reminder tags stabilized')
            self.last_mtime = os.path.getmtime(self.path)
Ejemplo n.º 7
0
 def alarm(self):
     ev.send('alarm', r_obj=self)
Ejemplo n.º 8
0
 def unschedule(self):
     ev.send('schedule', request='remove', r_obj=self)
Ejemplo n.º 9
0
 def schedule(self):
     ev.send('schedule', request='add', r_obj=self)