File: frigcal-products/unzipped/sharednames.py
"""
=====================================================================================
sharednames.py: common names used in both frigcal script and icsfiletools module.
Collected here so not coded redundantly in both files (and forgotten by updates!).
=====================================================================================
"""
# Python stdlib
import traceback, sys
from tkinter.messagebox import showerror
from tkinter import Tk
# constants
PROGRAM = 'Frigcal' # [3.0] uppercase
VERSION = 3.0 # [3.0] 2024 (2.0 was 2017)
# console messages
# set to (lamba *args: None) to turn off, and consider a .pyw on Windows
# trace = print
# [1.7] print \u escapes to suppress exceptions if non-ASCII text goes to a console
# which doesn't handle it, but special-case to avoid enclosing quotes for ASCII text;
# this is an issue on Windows in general, and on Mac OS X for GUIs run with no console;
# isascii() could be generalized for any code via functions--def tryit(func): try: func(),
# and tryit(lambda: parg.encode('ascii'))--but then which exceptions should imply False?;
def trace(*pargs, **kargs):
def isascii(text):
try: text.encode('ascii')
except: return False
else: return True
print(*((parg if isascii(parg) else ascii(parg)) for parg in pargs), **kargs)
def startuperror(message):
"""
[1.5] show an error message as a GUI popup and shutdown, before the
actual GUI has been built; used by filepath/parser errors here, but
elsewhere for import errors for configs file and icalender 3rd party
lib; none of these can print to the console only (or expect input from
it), as there may be no console on Windows, and GUI users expect GUIs;
caller adds sys.exc_info and traceback to message if appropriate;
must be here: imported from frigcal, which is not yet fully formed;
"""
traceback.print_exc() # exc to console, but also a GUI popup
root = Tk() # no GUI yet: make a dummy, hidden root
root.iconify()
showerror('%s: Startup Error' % PROGRAM, message)
sys.exit(1) # fatal errors: can't continue
# local: helper class to provide defaults for missing attrs [1.2]
from attributeproxy import AttributeProxy
# local: user config options - colors, fonts, paths, modes
try:
import frigcal_configs # formerly: as Configs
except:
# catch errors in configs file, [1.5]: plus GUI popup
exctext = traceback.format_exc()
errtext = ('Error while loading configs file.\n\n'
'An error in frigcal_configs.py is preventing frigcal start.\n\n'
"Please correct this file's error or restore a backup copy.\n"
'You can import this module by itself in Python to debug it.\n'
"The error returned by Python for frigcal's import follows:\n\n")
startuperror(errtext + exctext)
else:
Configs = AttributeProxy(frigcal_configs, warnof=True) # okay: wrap for defaults [1.2]
# defaults
Configs.icspath = Configs.icspath or 'Calendars' # in '.', calendars = all *.ics
#Configs.imgpath = Configs.imgpath or 'MonthImages' # in '.', 12 *.{jpg, gif, etc.}