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)
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
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')
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))
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)
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)
def alarm(self): ev.send('alarm', r_obj=self)
def unschedule(self): ev.send('schedule', request='remove', r_obj=self)
def schedule(self): ev.send('schedule', request='add', r_obj=self)