From 5cd04bda04f9f5473725c72a676ce0a26a25bab4 Mon Sep 17 00:00:00 2001 From: aceisace Date: Sun, 10 Apr 2022 06:35:08 +0200 Subject: [PATCH] Minor code improvements --- inkycal/custom/__init__.py | 1 + inkycal/custom/functions.py | 2 +- inkycal/custom/inkycal_exceptions.py | 16 ++++++++ inkycal/main.py | 7 +--- inkycal/modules/dev_module.py | 2 +- inkycal/modules/ical_parser.py | 57 ++++++++++++---------------- inkycal/modules/inky_image.py | 8 ++-- inkycal/modules/inkycal_agenda.py | 14 +++---- inkycal/modules/inkycal_calendar.py | 8 ++-- inkycal/modules/inkycal_feeds.py | 14 +++---- inkycal/modules/inkycal_image.py | 2 +- inkycal/modules/inkycal_jokes.py | 4 +- inkycal/modules/inkycal_server.py | 2 +- inkycal/modules/inkycal_slideshow.py | 4 +- inkycal/modules/inkycal_todoist.py | 22 +++++------ inkycal/modules/inkycal_weather.py | 16 +++----- 16 files changed, 84 insertions(+), 95 deletions(-) create mode 100644 inkycal/custom/inkycal_exceptions.py diff --git a/inkycal/custom/__init__.py b/inkycal/custom/__init__.py index c8f7548..b447171 100644 --- a/inkycal/custom/__init__.py +++ b/inkycal/custom/__init__.py @@ -1 +1,2 @@ from .functions import * +from .inkycal_exceptions import * diff --git a/inkycal/custom/functions.py b/inkycal/custom/functions.py index b07830b..cef5d48 100644 --- a/inkycal/custom/functions.py +++ b/inkycal/custom/functions.py @@ -243,7 +243,7 @@ def internet_available(): Returned output can be used to add a check for internet availability: - >>> if internet_available() == True: + >>> if internet_available(): >>> #...do something that requires internet connectivity """ diff --git a/inkycal/custom/inkycal_exceptions.py b/inkycal/custom/inkycal_exceptions.py new file mode 100644 index 0000000..cc9064f --- /dev/null +++ b/inkycal/custom/inkycal_exceptions.py @@ -0,0 +1,16 @@ +#!python3 +""" +Inkycal custom Exceptions +""" + + +class SettingsFileNotFoundError(Exception): + def __init__(self, message="Inkycal could not find a settings.json file. Please check the settings-file path"): + self.message = message + super().__init__(self.message) + + +class NetworkNotReachableError(Exception): + def __init__(self, message="Inkycal could not establish a connection to the web"): + self.message = message + super().__init__(self.message) diff --git a/inkycal/main.py b/inkycal/main.py index a9041b9..67f6fea 100644 --- a/inkycal/main.py +++ b/inkycal/main.py @@ -109,9 +109,7 @@ class Inkycal: self.settings = settings except FileNotFoundError: - print('No settings file found in given path\n' - 'Please double check your settings_path') - return + raise SettingsFileNotFoundError else: try: @@ -120,8 +118,7 @@ class Inkycal: self.settings = settings except FileNotFoundError: - print('No settings file found in /boot') - return + raise SettingsFileNotFoundError # Option to use epaper image optimisation, reduces colours self.optimize = True diff --git a/inkycal/modules/dev_module.py b/inkycal/modules/dev_module.py index dd11731..6e37af2 100644 --- a/inkycal/modules/dev_module.py +++ b/inkycal/modules/dev_module.py @@ -115,7 +115,7 @@ class Simple(inkycal_module): # Check if all required parameters are present # remove this if your module has no required parameters for param in self.requires: - if not param in config: + if param not in config: raise Exception('config is missing {}'.format(param)) # the web-UI removes any blank space from the input diff --git a/inkycal/modules/ical_parser.py b/inkycal/modules/ical_parser.py index 2698d49..cdf6037 100644 --- a/inkycal/modules/ical_parser.py +++ b/inkycal/modules/ical_parser.py @@ -4,6 +4,15 @@ iCalendar (parsing) module for Inky-Calendar Project Copyright by aceisace """ +import urllib +import arrow +from urllib.request import urlopen +import logging +import time +import os + +import recurring_ical_events +from icalendar import Calendar """ ---info about iCalendars--- • all day events start at midnight, ending at midnight of the next day @@ -13,24 +22,6 @@ Copyright by aceisace local timezone. Converting all-day events to local timezone is a problem! """ -import arrow -from urllib.request import urlopen -import logging -import time -import os - -try: - import recurring_ical_events -except ModuleNotFoundError: - print('recurring-ical-events library could not be found.') - print('Please install this with: pip3 install recurring-ical-events') - -try: - from icalendar import Calendar, Event -except ModuleNotFoundError: - print('icalendar library could not be found. Please install this with:') - print('pip3 install icalendar') - filename = os.path.basename(__file__).split('.py')[0] logger = logging.getLogger(filename) @@ -49,20 +40,6 @@ class iCalendar: add username and password to access protected files """ - if type(url) == list: - if (username == None) and (password == None): - ical = [Calendar.from_ical(str(urlopen(_).read().decode())) - for _ in url] - else: - ical = [auth_ical(each_url, username, password) for each_url in url] - elif type(url) == str: - if (username == None) and (password == None): - ical = [Calendar.from_ical(str(urlopen(url).read().decode()))] - else: - ical = [auth_ical(url, username, password)] - else: - raise Exception(f"Input: '{url}' is not a string or list!") - def auth_ical(url, uname, passwd): """Authorisation helper for protected ical files""" @@ -74,6 +51,20 @@ class iCalendar: ical = Calendar.from_ical(str(opener.open(url).read().decode())) return ical + if type(url) == list: + if (username is None) and (password is None): + ical = [Calendar.from_ical(str(urlopen(_).read().decode())) + for _ in url] + else: + ical = [auth_ical(each_url, username, password) for each_url in url] + elif type(url) == str: + if (username is None) and (password is None): + ical = [Calendar.from_ical(str(urlopen(url).read().decode()))] + else: + ical = [auth_ical(url, username, password)] + else: + raise Exception(f"Input: '{url}' is not a string or list!") + # Add the parsed icalendar/s to the self.icalendars list if ical: self.icalendars += ical logger.info('loaded iCalendars from URLs') @@ -106,7 +97,7 @@ class iCalendar: Returns a list of events sorted by date """ if type(timeline_start) == arrow.arrow.Arrow: - if timezone == None: + if timezone is None: timezone = 'UTC' t_start = timeline_start t_end = timeline_end diff --git a/inkycal/modules/inky_image.py b/inkycal/modules/inky_image.py index e78a0ec..49eae64 100644 --- a/inkycal/modules/inky_image.py +++ b/inkycal/modules/inky_image.py @@ -9,7 +9,7 @@ images. Copyright by aceisace """ -from PIL import Image, ImageOps, ImageColor +from PIL import Image import requests import numpy import os @@ -134,12 +134,12 @@ class Inkyimage: image = self.image if layout == 'horizontal': - if (image.height > image.width): + if image.height > image.width: logger.info('image width greater than image height, flipping') image = image.rotate(90, expand=True) elif layout == 'vertical': - if (image.width > image.height): + if image.width > image.height: logger.info('image width greater than image height, flipping') image = image.rotate(90, expand=True) else: @@ -242,7 +242,7 @@ class Inkyimage: if self._image_loaded(): image = self.image.convert('RGB') else: - logger.error('No image loaded') + raise FileNotFoundError if palette == 'bwr': # black-white-red palette diff --git a/inkycal/modules/inkycal_agenda.py b/inkycal/modules/inkycal_agenda.py index 46b4025..abfad28 100644 --- a/inkycal/modules/inkycal_agenda.py +++ b/inkycal/modules/inkycal_agenda.py @@ -5,12 +5,11 @@ Agenda module for Inky-Calendar Project Copyright by aceisace """ -from inkycal.modules.template import inkycal_module +import arrow + from inkycal.custom import * from inkycal.modules.ical_parser import iCalendar - -import calendar as cal -import arrow +from inkycal.modules.template import inkycal_module filename = os.path.basename(__file__).split('.py')[0] logger = logging.getLogger(filename) @@ -58,9 +57,8 @@ class Agenda(inkycal_module): # Check if all required parameters are present for param in self.requires: - if not param in config: + if param not in config: raise Exception(f'config is missing {param}') - logger.exception(f'config is missing "{param}"') # module specific parameters self.date_format = config['date_format'] @@ -184,7 +182,7 @@ class Agenda(inkycal_module): title = _['title'] # Check if item is a date - if not 'end' in _: + if 'end' not in _: ImageDraw.Draw(im_colour).line( (0, line_pos[cursor][1], im_width, line_pos[cursor][1]), fill='black') @@ -199,7 +197,7 @@ class Agenda(inkycal_module): time = _['begin'].format(self.time_format) # Check if event is all day, if not, add the time - if parser.all_day(_) == False: + if not parser.all_day(_): write(im_black, (x_time, line_pos[cursor][1]), (time_width, line_height), time, font=self.font, alignment='left') diff --git a/inkycal/modules/inkycal_calendar.py b/inkycal/modules/inkycal_calendar.py index b37b5ea..313d05b 100644 --- a/inkycal/modules/inkycal_calendar.py +++ b/inkycal/modules/inkycal_calendar.py @@ -108,7 +108,7 @@ class Calendar(inkycal_module): logger.debug(f"month_name_height: {month_name_height}") logger.debug(f"weekdays_height: {weekdays_height}") - if self.show_events == True: + if self.show_events: logger.debug("Allocating space for events") calendar_height = int(im_height * 0.6) events_height = im_height - month_name_height - weekdays_height - calendar_height @@ -207,7 +207,7 @@ class Calendar(inkycal_module): im_colour.paste(icon, current_day_pos, icon) # If events should be loaded and shown... - if self.show_events == True: + if self.show_events: # If this month requires 5 instead of 6 rows, increase event section height if len(cal.monthcalendar(now.year, now.month)) == 5: @@ -277,7 +277,7 @@ class Calendar(inkycal_module): self._upcoming_events = upcoming_events # delete events which won't be able to fit (more events than lines) - upcoming_events[:max_event_lines] + upcoming_events = upcoming_events[:max_event_lines] # Check if any events were found in the given timerange if upcoming_events: @@ -315,7 +315,7 @@ class Calendar(inkycal_module): date, font=self.font, alignment='left') # Check if event is all day - if parser.all_day(event) == True: + if parser.all_day(event): write(im_black, (date_width, event_lines[cursor][1]), (event_width_l, line_height), name, font=self.font, alignment='left') diff --git a/inkycal/modules/inkycal_feeds.py b/inkycal/modules/inkycal_feeds.py index 5a53105..9ad0bed 100644 --- a/inkycal/modules/inkycal_feeds.py +++ b/inkycal/modules/inkycal_feeds.py @@ -11,11 +11,7 @@ from inkycal.custom import * from random import shuffle -try: - import feedparser -except ImportError: - print('feedparser is not installed! Please install with:') - print('pip3 install feedparser') +import feedparser filename = os.path.basename(__file__).split('.py')[0] logger = logging.getLogger(filename) @@ -54,7 +50,7 @@ class Feeds(inkycal_module): # Check if all required parameters are present for param in self.requires: - if not param in config: + if param not in config: raise Exception(f'config is missing {param}') # required parameters @@ -89,10 +85,10 @@ class Feeds(inkycal_module): im_colour = Image.new('RGB', size=im_size, color='white') # Check if internet is available - if internet_available() == True: + if internet_available(): logger.info('Connection test passed') else: - raise Exception('Network could not be reached :/') + raise NetworkNotReachableError # Set some parameters for formatting feeds line_spacing = 1 @@ -119,7 +115,7 @@ class Feeds(inkycal_module): self._parsed_feeds = parsed_feeds # Shuffle the list to prevent showing the same content - if self.shuffle_feeds == True: + if self.shuffle_feeds: shuffle(parsed_feeds) # Trim down the list to the max number of lines diff --git a/inkycal/modules/inkycal_image.py b/inkycal/modules/inkycal_image.py index 3a1b659..f07722a 100644 --- a/inkycal/modules/inkycal_image.py +++ b/inkycal/modules/inkycal_image.py @@ -88,7 +88,7 @@ class Inkyimage(inkycal_module): im.remove_alpha() # if autoflip was enabled, flip the image - if self.autoflip == True: + if self.autoflip: im.autoflip(self.orientation) # resize the image so it can fit on the epaper diff --git a/inkycal/modules/inkycal_jokes.py b/inkycal/modules/inkycal_jokes.py index db69a6f..773347f 100644 --- a/inkycal/modules/inkycal_jokes.py +++ b/inkycal/modules/inkycal_jokes.py @@ -49,10 +49,10 @@ class Jokes(inkycal_module): im_colour = Image.new('RGB', size=im_size, color='white') # Check if internet is available - if internet_available() == True: + if internet_available(): logger.info('Connection test passed') else: - raise Exception('Network could not be reached :/') + raise NetworkNotReachableError # Set some parameters for formatting feeds line_spacing = 1 diff --git a/inkycal/modules/inkycal_server.py b/inkycal/modules/inkycal_server.py index b650d18..04105e8 100644 --- a/inkycal/modules/inkycal_server.py +++ b/inkycal/modules/inkycal_server.py @@ -58,7 +58,7 @@ class Inkyserver(inkycal_module): # required parameters for param in self.requires: - if not param in config: + if param not in config: raise Exception(f'config is missing {param}') # optional parameters diff --git a/inkycal/modules/inkycal_slideshow.py b/inkycal/modules/inkycal_slideshow.py index 2ad03b5..d8e85c2 100644 --- a/inkycal/modules/inkycal_slideshow.py +++ b/inkycal/modules/inkycal_slideshow.py @@ -97,7 +97,7 @@ class Slideshow(inkycal_module): return somelist[1:] + somelist[:1] # Switch to the next image if this is not the first run - if self._first_run == True: + if self._first_run: self._first_run = False else: self.images = rotate(self.images) @@ -115,7 +115,7 @@ class Slideshow(inkycal_module): im.remove_alpha() # if autoflip was enabled, flip the image - if self.autoflip == True: + if self.autoflip: im.autoflip(self.orientation) # resize the image so it can fit on the epaper diff --git a/inkycal/modules/inkycal_todoist.py b/inkycal/modules/inkycal_todoist.py index d2c921b..abd5db3 100644 --- a/inkycal/modules/inkycal_todoist.py +++ b/inkycal/modules/inkycal_todoist.py @@ -8,11 +8,7 @@ Copyright by aceisace from inkycal.modules.template import inkycal_module from inkycal.custom import * -try: - import todoist -except ImportError: - print('todoist is not installed! Please install with:') - print('pip3 install todoist-python') +import todoist filename = os.path.basename(__file__).split('.py')[0] logger = logging.getLogger(filename) @@ -20,7 +16,7 @@ logger = logging.getLogger(filename) class Todoist(inkycal_module): """Todoist api class - parses todo's from api-key + parses todos from api-key """ name = "Todoist API - show your todos from todoist" @@ -47,7 +43,7 @@ class Todoist(inkycal_module): # Check if all required parameters are present for param in self.requires: - if not param in config: + if param not in config: raise Exception(f'config is missing {param}') # module specific parameters @@ -84,11 +80,11 @@ class Todoist(inkycal_module): im_colour = Image.new('RGB', size=im_size, color='white') # Check if internet is available - if internet_available() == True: + if internet_available(): logger.info('Connection test passed') self._api.sync() else: - raise Exception('Network could not be reached :/') + raise NetworkNotReachableError # Set some parameters for formatting todos line_spacing = 1 @@ -134,7 +130,7 @@ class Todoist(inkycal_module): simplified = [ { 'name': task['content'], - 'due': task['due']['string'] if task['due'] != None else "", + 'due': task['due']['string'] if task['due'] is not None else "", 'priority': task['priority'], 'project': all_projects[task['project_id']] if task['project_id'] in all_projects else "deleted" } @@ -170,13 +166,13 @@ class Todoist(inkycal_module): if cursor < len(line_positions): line_x, line_y = line_positions[cursor] - # Add todo project name + # Add todos project name write( im_colour, line_positions[cursor], (project_width, line_height), todo['project'], font=self.font, alignment='left') - # Add todo due if not empty + # Add todos due if not empty if todo['due'] != "": write( im_black, @@ -184,7 +180,7 @@ class Todoist(inkycal_module): (due_width, line_height), todo['due'], font=self.font, alignment='left') - # Add todo name + # Add todos name write( im_black, (line_x + project_width + due_width, line_y), diff --git a/inkycal/modules/inkycal_weather.py b/inkycal/modules/inkycal_weather.py index 1c26dcb..2b3d875 100644 --- a/inkycal/modules/inkycal_weather.py +++ b/inkycal/modules/inkycal_weather.py @@ -10,13 +10,8 @@ from inkycal.custom import * import math, decimal import arrow -from locale import getdefaultlocale as sys_locale -try: - from pyowm.owm import OWM -except ImportError: - print('pyowm is not installed! Please install with:') - print('pip3 install pyowm') +from pyowm.owm import OWM filename = os.path.basename(__file__).split('.py')[0] logger = logging.getLogger(filename) @@ -123,11 +118,10 @@ class Weather(inkycal_module): im_colour = Image.new('RGB', size=im_size, color='white') # Check if internet is available - if internet_available() == True: + if internet_available(): logger.info('Connection test passed') else: - logger.exception('Network could not be reached :(') - raise + raise NetworkNotReachableError def get_moon_phase(): """Calculate the current (approximate) moon phase""" @@ -426,11 +420,11 @@ class Weather(inkycal_module): sunset = sunset_raw.format('H:mm') # Format the windspeed to user preference - if self.use_beaufort == True: + if self.use_beaufort: logger.debug("using beaufort for wind") wind = str(weather.wind(unit='beaufort')['speed']) - elif self.use_beaufort == False: + else: if self.units == 'metric': logging.debug('getting windspeed in metric unit')