PrEditor 0.0.0.dev1__py2.py3-none-any.whl → 0.1.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of PrEditor might be problematic. Click here for more details.
- PrEditor-0.1.0.dist-info/LICENSE +165 -0
- PrEditor-0.1.0.dist-info/METADATA +212 -0
- PrEditor-0.1.0.dist-info/RECORD +149 -0
- {PrEditor-0.0.0.dev1.dist-info → PrEditor-0.1.0.dist-info}/WHEEL +1 -1
- PrEditor-0.1.0.dist-info/entry_points.txt +18 -0
- PrEditor-0.1.0.dist-info/top_level.txt +1 -0
- preditor/__init__.py +301 -0
- {blurdev → preditor}/__main__.py +13 -13
- preditor/about_module.py +166 -0
- preditor/cli.py +192 -0
- {blurdev → preditor}/contexts.py +119 -119
- preditor/cores/core.py +65 -0
- preditor/dccs/maya/PrEditor_maya.mod +2 -0
- preditor/dccs/maya/plug-ins/PrEditor_maya.py +108 -0
- preditor/debug.py +294 -0
- blurdev/scintilla/delayable_engine.py → preditor/delayable_engine/__init__.py +310 -299
- blurdev/scintilla/delayables/base.py → preditor/delayable_engine/delayables.py +85 -85
- {blurdev → preditor}/enum.py +728 -1003
- {blurdev → preditor}/gui/__init__.py +84 -125
- preditor/gui/app.py +159 -0
- {blurdev → preditor}/gui/codehighlighter.py +209 -219
- {blurdev → preditor}/gui/completer.py +226 -236
- {blurdev → preditor}/gui/console.py +801 -858
- {blurdev → preditor}/gui/dialog.py +200 -216
- preditor/gui/drag_tab_bar.py +190 -0
- preditor/gui/editor_chooser.py +57 -0
- {blurdev → preditor}/gui/errordialog.py +100 -97
- preditor/gui/fuzzy_search/fuzzy_search.py +93 -0
- preditor/gui/group_tab_widget/__init__.py +319 -0
- preditor/gui/group_tab_widget/grouped_tab_menu.py +35 -0
- preditor/gui/group_tab_widget/grouped_tab_models.py +108 -0
- preditor/gui/group_tab_widget/grouped_tab_widget.py +75 -0
- preditor/gui/group_tab_widget/one_tab_widget.py +54 -0
- preditor/gui/level_buttons.py +349 -0
- {blurdev → preditor}/gui/logger_window_handler.py +46 -45
- {blurdev → preditor}/gui/loggerwindow.py +1205 -1417
- {blurdev → preditor}/gui/newtabwidget.py +69 -68
- {blurdev → preditor}/gui/redmine_login_dialog.py +63 -61
- {blurdev → preditor}/gui/set_text_editor_path_dialog.py +59 -57
- preditor/gui/ui/editor_chooser.ui +93 -0
- {blurdev → preditor}/gui/ui/errordialog.ui +81 -81
- {blurdev → preditor}/gui/ui/loggerwindow.ui +1030 -864
- {blurdev → preditor}/gui/ui/redmine_login_dialog.ui +124 -124
- {blurdev → preditor}/gui/ui/set_text_editor_path_dialog.ui +149 -149
- {blurdev → preditor}/gui/window.py +183 -199
- preditor/gui/workbox_mixin.py +357 -0
- preditor/gui/workbox_text_edit.py +117 -0
- preditor/gui/workboxwidget.py +276 -0
- preditor/logging_config.py +52 -0
- preditor/osystem.py +401 -0
- preditor/plugins.py +65 -0
- preditor/prefs.py +74 -0
- {blurdev → preditor}/resource/environment_variables.html +26 -38
- {blurdev → preditor}/resource/error_mail.html +85 -85
- {blurdev → preditor}/resource/error_mail_inline.html +41 -41
- preditor/resource/img/README.md +7 -0
- preditor/resource/img/arrow_forward.png +0 -0
- preditor/resource/img/check-bold.png +0 -0
- preditor/resource/img/chevron-down.png +0 -0
- preditor/resource/img/chevron-up.png +0 -0
- preditor/resource/img/close-thick.png +0 -0
- preditor/resource/img/comment-edit.png +0 -0
- preditor/resource/img/content-copy.png +0 -0
- preditor/resource/img/content-cut.png +0 -0
- preditor/resource/img/content-duplicate.png +0 -0
- preditor/resource/img/content-paste.png +0 -0
- preditor/resource/img/content-save.png +0 -0
- preditor/resource/img/debug_disabled.png +0 -0
- preditor/resource/img/eye-check.png +0 -0
- preditor/resource/img/file-plus.png +0 -0
- preditor/resource/img/file-remove.png +0 -0
- preditor/resource/img/format-align-left.png +0 -0
- preditor/resource/img/format-letter-case-lower.png +0 -0
- preditor/resource/img/format-letter-case-upper.png +0 -0
- preditor/resource/img/information.png +0 -0
- preditor/resource/img/logging_critical.png +0 -0
- preditor/resource/img/logging_custom.png +0 -0
- preditor/resource/img/logging_debug.png +0 -0
- preditor/resource/img/logging_error.png +0 -0
- preditor/resource/img/logging_info.png +0 -0
- preditor/resource/img/logging_not_set.png +0 -0
- preditor/resource/img/logging_warning.png +0 -0
- preditor/resource/img/marker.png +0 -0
- preditor/resource/img/play.png +0 -0
- preditor/resource/img/playlist-play.png +0 -0
- preditor/resource/img/plus-minus-variant.png +0 -0
- preditor/resource/img/preditor.ico +0 -0
- preditor/resource/img/preditor.png +0 -0
- preditor/resource/img/preditor.psd +0 -0
- preditor/resource/img/preditor.svg +44 -0
- preditor/resource/img/restart.svg +1 -0
- preditor/resource/img/skip-forward-outline.png +0 -0
- preditor/resource/img/skip-next-outline.png +0 -0
- preditor/resource/img/skip-next.png +0 -0
- preditor/resource/img/skip-previous.png +0 -0
- preditor/resource/img/subdirectory-arrow-right.png +0 -0
- preditor/resource/img/text-search-variant.png +0 -0
- {blurdev → preditor}/resource/lang/python.json +30 -30
- preditor/resource/settings.ini +25 -0
- {blurdev/resource/stylesheet/logger → preditor/resource/stylesheet}/Bright.css +56 -61
- {blurdev → preditor}/resource/stylesheet/Dark.css +190 -132
- {blurdev → preditor}/scintilla/__init__.py +22 -28
- preditor/scintilla/delayables/__init__.py +11 -0
- {blurdev → preditor}/scintilla/delayables/smart_highlight.py +94 -93
- {blurdev → preditor}/scintilla/delayables/spell_check.py +173 -172
- {blurdev → preditor}/scintilla/documenteditor.py +2039 -2115
- {blurdev → preditor}/scintilla/finddialog.py +68 -81
- {blurdev → preditor}/scintilla/lang/__init__.py +80 -93
- {blurdev → preditor}/scintilla/lang/config/bash.ini +15 -15
- {blurdev → preditor}/scintilla/lang/config/batch.ini +14 -14
- {blurdev → preditor}/scintilla/lang/config/cpp.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/css.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/eyeonscript.ini +17 -17
- {blurdev → preditor}/scintilla/lang/config/html.ini +21 -21
- {blurdev → preditor}/scintilla/lang/config/javascript.ini +24 -24
- {blurdev → preditor}/scintilla/lang/config/lua.ini +16 -16
- {blurdev → preditor}/scintilla/lang/config/maxscript.ini +20 -20
- {blurdev → preditor}/scintilla/lang/config/mel.ini +18 -18
- {blurdev → preditor}/scintilla/lang/config/mu.ini +22 -22
- {blurdev → preditor}/scintilla/lang/config/nsi.ini +5 -5
- {blurdev → preditor}/scintilla/lang/config/perl.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/puppet.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/python.ini +28 -28
- {blurdev → preditor}/scintilla/lang/config/ruby.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/sql.ini +7 -7
- {blurdev → preditor}/scintilla/lang/config/xml.ini +21 -21
- {blurdev → preditor}/scintilla/lang/config/yaml.ini +18 -18
- {blurdev → preditor}/scintilla/lang/language.py +240 -250
- preditor/scintilla/lexers/__init__.py +0 -0
- {blurdev → preditor}/scintilla/lexers/cpplexer.py +21 -30
- {blurdev → preditor}/scintilla/lexers/javascriptlexer.py +25 -34
- {blurdev → preditor}/scintilla/lexers/maxscriptlexer.py +234 -253
- {blurdev → preditor}/scintilla/lexers/mellexer.py +368 -376
- {blurdev → preditor}/scintilla/lexers/mulexer.py +32 -41
- {blurdev → preditor}/scintilla/lexers/pythonlexer.py +41 -50
- {blurdev → preditor}/scintilla/ui/finddialog.ui +160 -160
- preditor/settings.py +71 -0
- preditor/stream/__init__.py +80 -0
- preditor/stream/director.py +56 -0
- preditor/stream/manager.py +74 -0
- preditor/streamhandler_helper.py +46 -0
- preditor/utils/__init__.py +0 -0
- preditor/utils/cute.py +30 -0
- preditor/utils/stylesheets.py +54 -0
- {blurdev → preditor}/version.py +5 -5
- preditor/weakref.py +363 -0
- PrEditor-0.0.0.dev1.dist-info/METADATA +0 -51
- PrEditor-0.0.0.dev1.dist-info/RECORD +0 -279
- PrEditor-0.0.0.dev1.dist-info/top_level.txt +0 -1
- blurdev/__init__.py +0 -356
- blurdev/cores/__init__.py +0 -98
- blurdev/cores/application.py +0 -26
- blurdev/cores/core.py +0 -634
- blurdev/debug.py +0 -593
- blurdev/external.py +0 -391
- blurdev/gui/level_buttons.py +0 -585
- blurdev/gui/workboxwidget.py +0 -205
- blurdev/logger.py +0 -238
- blurdev/osystem.py +0 -813
- blurdev/prefs.py +0 -33
- blurdev/protocols/__init__.py +0 -71
- blurdev/protocols/write_std_output_handler.py +0 -83
- blurdev/resource/designer_plugins.xml +0 -9
- blurdev/resource/error_email_old.html +0 -41
- blurdev/resource/img/add.png +0 -0
- blurdev/resource/img/ajax-loader.gif +0 -0
- blurdev/resource/img/application.png +0 -0
- blurdev/resource/img/applications.png +0 -0
- blurdev/resource/img/assburner.png +0 -0
- blurdev/resource/img/assfreezer.png +0 -0
- blurdev/resource/img/bar.gif +0 -0
- blurdev/resource/img/blank.png +0 -0
- blurdev/resource/img/blurdev.png +0 -0
- blurdev/resource/img/calendar_disabled.png +0 -0
- blurdev/resource/img/calendar_enabled.png +0 -0
- blurdev/resource/img/cancel.png +0 -0
- blurdev/resource/img/custom.png +0 -0
- blurdev/resource/img/debug_high.png +0 -0
- blurdev/resource/img/debug_low.png +0 -0
- blurdev/resource/img/debug_mid.png +0 -0
- blurdev/resource/img/debug_off.png +0 -0
- blurdev/resource/img/django.png +0 -0
- blurdev/resource/img/doc.png +0 -0
- blurdev/resource/img/edit.png +0 -0
- blurdev/resource/img/elemental.png +0 -0
- blurdev/resource/img/explore.png +0 -0
- blurdev/resource/img/favorite.png +0 -0
- blurdev/resource/img/file.png +0 -0
- blurdev/resource/img/folder.png +0 -0
- blurdev/resource/img/ide/add.png +0 -0
- blurdev/resource/img/ide/add_note.png +0 -0
- blurdev/resource/img/ide/arrow_down.png +0 -0
- blurdev/resource/img/ide/arrow_up.png +0 -0
- blurdev/resource/img/ide/check.png +0 -0
- blurdev/resource/img/ide/class.png +0 -0
- blurdev/resource/img/ide/clean.png +0 -0
- blurdev/resource/img/ide/clearlog.png +0 -0
- blurdev/resource/img/ide/close.png +0 -0
- blurdev/resource/img/ide/comment_add.png +0 -0
- blurdev/resource/img/ide/comment_remove.png +0 -0
- blurdev/resource/img/ide/comment_toggle.png +0 -0
- blurdev/resource/img/ide/console.png +0 -0
- blurdev/resource/img/ide/copy.png +0 -0
- blurdev/resource/img/ide/copylstrip.png +0 -0
- blurdev/resource/img/ide/cut.png +0 -0
- blurdev/resource/img/ide/edit.png +0 -0
- blurdev/resource/img/ide/find.png +0 -0
- blurdev/resource/img/ide/find_replace.png +0 -0
- blurdev/resource/img/ide/findnext.png +0 -0
- blurdev/resource/img/ide/findprev.png +0 -0
- blurdev/resource/img/ide/folder_find.png +0 -0
- blurdev/resource/img/ide/function.png +0 -0
- blurdev/resource/img/ide/git-bash.png +0 -0
- blurdev/resource/img/ide/git-gui.png +0 -0
- blurdev/resource/img/ide/gitk.png +0 -0
- blurdev/resource/img/ide/goto.png +0 -0
- blurdev/resource/img/ide/goto_def.png +0 -0
- blurdev/resource/img/ide/help.png +0 -0
- blurdev/resource/img/ide/highlighter.png +0 -0
- blurdev/resource/img/ide/lowercase.png +0 -0
- blurdev/resource/img/ide/newfile.png +0 -0
- blurdev/resource/img/ide/newfolder.png +0 -0
- blurdev/resource/img/ide/newproject.png +0 -0
- blurdev/resource/img/ide/newwizard.png +0 -0
- blurdev/resource/img/ide/open.png +0 -0
- blurdev/resource/img/ide/paste.png +0 -0
- blurdev/resource/img/ide/pdb_continue.png +0 -0
- blurdev/resource/img/ide/pdb_down.png +0 -0
- blurdev/resource/img/ide/pdb_next.png +0 -0
- blurdev/resource/img/ide/pdb_step.png +0 -0
- blurdev/resource/img/ide/pdb_up.png +0 -0
- blurdev/resource/img/ide/plus_minus.png +0 -0
- blurdev/resource/img/ide/preferences.png +0 -0
- blurdev/resource/img/ide/project_find.png +0 -0
- blurdev/resource/img/ide/python.png +0 -0
- blurdev/resource/img/ide/pyular.png +0 -0
- blurdev/resource/img/ide/qt.png +0 -0
- blurdev/resource/img/ide/quit.png +0 -0
- blurdev/resource/img/ide/redo.png +0 -0
- blurdev/resource/img/ide/refresh.png +0 -0
- blurdev/resource/img/ide/remove.png +0 -0
- blurdev/resource/img/ide/ruler.png +0 -0
- blurdev/resource/img/ide/run.png +0 -0
- blurdev/resource/img/ide/runall.png +0 -0
- blurdev/resource/img/ide/runallclear.png +0 -0
- blurdev/resource/img/ide/runselected.png +0 -0
- blurdev/resource/img/ide/runselectedclear.png +0 -0
- blurdev/resource/img/ide/save.png +0 -0
- blurdev/resource/img/ide/saveas.png +0 -0
- blurdev/resource/img/ide/sdk.png +0 -0
- blurdev/resource/img/ide/separator.png +0 -0
- blurdev/resource/img/ide/tabbed.png +0 -0
- blurdev/resource/img/ide/tile.png +0 -0
- blurdev/resource/img/ide/toolbar.png +0 -0
- blurdev/resource/img/ide/undo.png +0 -0
- blurdev/resource/img/ide/uppercase.png +0 -0
- blurdev/resource/img/ide/view_as.png +0 -0
- blurdev/resource/img/ide/windowed.png +0 -0
- blurdev/resource/img/ide.ico +0 -0
- blurdev/resource/img/ide.png +0 -0
- blurdev/resource/img/ide48.png +0 -0
- blurdev/resource/img/info.png +0 -0
- blurdev/resource/img/legacy tool.png +0 -0
- blurdev/resource/img/library.png +0 -0
- blurdev/resource/img/logger/about.png +0 -0
- blurdev/resource/img/logger/arrow_forward.png +0 -0
- blurdev/resource/img/logger/clear.png +0 -0
- blurdev/resource/img/logger/close.png +0 -0
- blurdev/resource/img/logger/debug_disabled.png +0 -0
- blurdev/resource/img/logger/debug_high.png +0 -0
- blurdev/resource/img/logger/debug_low.png +0 -0
- blurdev/resource/img/logger/debug_mid.png +0 -0
- blurdev/resource/img/logger/down.png +0 -0
- blurdev/resource/img/logger/find.png +0 -0
- blurdev/resource/img/logger/logging_critical.png +0 -0
- blurdev/resource/img/logger/logging_debug.png +0 -0
- blurdev/resource/img/logger/logging_error.png +0 -0
- blurdev/resource/img/logger/logging_info.png +0 -0
- blurdev/resource/img/logger/logging_not_set.png +0 -0
- blurdev/resource/img/logger/logging_warning.png +0 -0
- blurdev/resource/img/logger/next.png +0 -0
- blurdev/resource/img/logger/play.png +0 -0
- blurdev/resource/img/logger/playlist_play.png +0 -0
- blurdev/resource/img/logger/previous.png +0 -0
- blurdev/resource/img/logger/return.png +0 -0
- blurdev/resource/img/logger/save.png +0 -0
- blurdev/resource/img/logger/subdirectory_arrow_right.png +0 -0
- blurdev/resource/img/logger/up.png +0 -0
- blurdev/resource/img/lovebar.png +0 -0
- blurdev/resource/img/new.png +0 -0
- blurdev/resource/img/new_selected.png +0 -0
- blurdev/resource/img/node.png +0 -0
- blurdev/resource/img/ok.png +0 -0
- blurdev/resource/img/options.png +0 -0
- blurdev/resource/img/packages.png +0 -0
- blurdev/resource/img/preview/add.png +0 -0
- blurdev/resource/img/preview/brush.png +0 -0
- blurdev/resource/img/preview/delete.png +0 -0
- blurdev/resource/img/preview/delte.png +0 -0
- blurdev/resource/img/preview/fill.png +0 -0
- blurdev/resource/img/preview/layers.png +0 -0
- blurdev/resource/img/preview/media.png +0 -0
- blurdev/resource/img/preview/navigate.png +0 -0
- blurdev/resource/img/preview/pencil.png +0 -0
- blurdev/resource/img/preview/select.png +0 -0
- blurdev/resource/img/preview/type.png +0 -0
- blurdev/resource/img/preview/visible.png +0 -0
- blurdev/resource/img/project.png +0 -0
- blurdev/resource/img/python_logger.ico +0 -0
- blurdev/resource/img/python_logger.png +0 -0
- blurdev/resource/img/refresh.png +0 -0
- blurdev/resource/img/remove.png +0 -0
- blurdev/resource/img/reset.png +0 -0
- blurdev/resource/img/richtext/font_bold.png +0 -0
- blurdev/resource/img/richtext/font_italic.png +0 -0
- blurdev/resource/img/richtext/link_image.png +0 -0
- blurdev/resource/img/richtext/spell_check.png +0 -0
- blurdev/resource/img/richtext/unordered_list.png +0 -0
- blurdev/resource/img/save.png +0 -0
- blurdev/resource/img/savesettings.png +0 -0
- blurdev/resource/img/settings.png +0 -0
- blurdev/resource/img/tool.png +0 -0
- blurdev/resource/img/toolbarHandleHorizontal.png +0 -0
- blurdev/resource/img/toolbarHandleVertical.png +0 -0
- blurdev/resource/img/trash.png +0 -0
- blurdev/resource/img/trax.png +0 -0
- blurdev/resource/img/tree.png +0 -0
- blurdev/resource/img/treegrunt.ico +0 -0
- blurdev/resource/img/treegrunt.png +0 -0
- blurdev/resource/img/treegruntedit.png +0 -0
- blurdev/resource/img/user interface.png +0 -0
- blurdev/resource/img/warning.png +0 -0
- blurdev/resource/img/watermark.png +0 -0
- blurdev/resource/sdk/blurdev.sdk +0 -3
- blurdev/resource/settings.ini +0 -82
- blurdev/resource/softimage/BlurApplication.dll +0 -0
- blurdev/resource/softimage/BlurApplication64.dll +0 -0
- blurdev/resource/stylesheet/Carbon.css +0 -35
- blurdev/resource/stylesheet/logger/Dark.css +0 -62
- blurdev/resource/templ/py_comment.templ +0 -1
- blurdev/resource/templ/py_debug_raise_error.templ +0 -7
- blurdev/resource/templ/py_doc_string.templ +0 -10
- blurdev/resource/templ/py_header.templ +0 -9
- blurdev/resource/templ/py_line_comment.templ +0 -1
- blurdev/resource/templ/py_log_to_file.templ +0 -22
- blurdev/resource/templ/py_module_path.templ +0 -1
- blurdev/resource/templ/py_pyqt_core.templ +0 -1
- blurdev/resource/templ/py_pyqt_gui.templ +0 -1
- blurdev/resource/templ/py_splashscreen.templ +0 -6
- blurdev/resource/templ/py_testing_note.templ +0 -1
- blurdev/resource/templ/py_testing_note_end.templ +0 -1
- blurdev/resource/tools_environments.json +0 -72
- blurdev/resource/tools_environments.xml +0 -11
- blurdev/resource/tools_environments_linux.xml +0 -11
- blurdev/resource/tools_environments_offline.xml +0 -7
- blurdev/runtimes/__init__.py +0 -2
- blurdev/runtimes/logger.py +0 -44
- blurdev/scintilla/delayables/__init__.py +0 -9
- blurdev/settings.py +0 -312
- blurdev/utils/error.py +0 -389
- {blurdev/scintilla/lexers → preditor/cores}/__init__.py +0 -0
- {blurdev/utils → preditor/gui/fuzzy_search}/__init__.py +0 -0
- {blurdev → preditor}/resource/img/warning-big.png +0 -0
preditor/debug.py
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
from __future__ import absolute_import, print_function
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
import inspect
|
|
5
|
+
import logging
|
|
6
|
+
import sys
|
|
7
|
+
import traceback
|
|
8
|
+
|
|
9
|
+
from Qt import QtCompat
|
|
10
|
+
|
|
11
|
+
from . import core, root_window
|
|
12
|
+
from .contexts import ErrorReport
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class FileLogger:
|
|
18
|
+
def __init__(self, stdhandle, logfile, _print=True, clearLog=True):
|
|
19
|
+
self._stdhandle = stdhandle
|
|
20
|
+
self._logfile = logfile
|
|
21
|
+
self._print = _print
|
|
22
|
+
if clearLog:
|
|
23
|
+
# clear the log file
|
|
24
|
+
self.clear()
|
|
25
|
+
|
|
26
|
+
def clear(self, stamp=False):
|
|
27
|
+
"""Removes the contents of the log file."""
|
|
28
|
+
open(self._logfile, 'w').close()
|
|
29
|
+
if stamp:
|
|
30
|
+
msg = '--------- Date: {today} Version: {version} ---------'
|
|
31
|
+
print(msg.format(today=datetime.datetime.today(), version=sys.version))
|
|
32
|
+
|
|
33
|
+
def flush(self):
|
|
34
|
+
self._stdhandle.flush()
|
|
35
|
+
|
|
36
|
+
def write(self, msg):
|
|
37
|
+
f = open(self._logfile, 'a')
|
|
38
|
+
f.write(msg)
|
|
39
|
+
f.close()
|
|
40
|
+
if self._print:
|
|
41
|
+
self._stdhandle.write(msg)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def logToFile(path, stdout=True, stderr=True, useOldStd=True, clearLog=True):
|
|
45
|
+
"""Redirect all stdout and/or stderr output to a log file.
|
|
46
|
+
|
|
47
|
+
Creates a FileLogger class for stdout and stderr and installs itself in python.
|
|
48
|
+
All output will be logged to the file path. Prints the current datetime and
|
|
49
|
+
sys.version info when stdout is True.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
path (str): File path to log output to.
|
|
53
|
+
|
|
54
|
+
stdout (bool): If True(default) override sys.stdout.
|
|
55
|
+
|
|
56
|
+
stderr (bool): If True(default) override sys.stderr.
|
|
57
|
+
|
|
58
|
+
useOldStd (bool): If True, messages will be written to the FileLogger
|
|
59
|
+
and the previous sys.stdout/sys.stderr.
|
|
60
|
+
|
|
61
|
+
clearLog (bool): If True(default) clear the log file when this command is
|
|
62
|
+
called.
|
|
63
|
+
"""
|
|
64
|
+
if stderr:
|
|
65
|
+
sys.stderr = FileLogger(sys.stderr, path, useOldStd, clearLog=clearLog)
|
|
66
|
+
if stdout:
|
|
67
|
+
sys.stdout = FileLogger(sys.stdout, path, useOldStd, clearLog=False)
|
|
68
|
+
if clearLog:
|
|
69
|
+
sys.stdout.clear(stamp=True)
|
|
70
|
+
|
|
71
|
+
from .streamhandler_helper import StreamHandlerHelper
|
|
72
|
+
|
|
73
|
+
# Update any StreamHandler's that were setup using the old stdout/err
|
|
74
|
+
if stdout:
|
|
75
|
+
StreamHandlerHelper.replace_stream(sys.stdout._stdhandle, sys.stdout)
|
|
76
|
+
if stderr:
|
|
77
|
+
StreamHandlerHelper.replace_stream(sys.stderr._stdhandle, sys.stderr)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# --------------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class BlurExcepthook(object):
|
|
84
|
+
"""
|
|
85
|
+
Blur's excepthook override allowing for granular error handling
|
|
86
|
+
customization.
|
|
87
|
+
|
|
88
|
+
Stacked atop the standard library excepthook (by default), catches any
|
|
89
|
+
unhandled exceptions and conditionally passes them to the following custom
|
|
90
|
+
excepthooks:
|
|
91
|
+
|
|
92
|
+
- *`call_base_excepthook`*
|
|
93
|
+
excepthook callable supplied at initialization; if not supplied or
|
|
94
|
+
invalid, executes standard library excepthook.
|
|
95
|
+
|
|
96
|
+
- *`send_exception_email`*
|
|
97
|
+
email notification.
|
|
98
|
+
|
|
99
|
+
- *`send_logger_error`*
|
|
100
|
+
logger console.
|
|
101
|
+
|
|
102
|
+
Arguments:
|
|
103
|
+
ehook (callable): An excepthook callable compatible with signature of
|
|
104
|
+
sys.excepthook; defaults to original startup excepthook
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
def __init__(self, base_excepthook=None):
|
|
108
|
+
self.base_excepthook = base_excepthook or sys.__excepthook__
|
|
109
|
+
# We can't show the prompt if running headless.
|
|
110
|
+
self.actions = dict(email=True, prompt=not core.headless)
|
|
111
|
+
|
|
112
|
+
def __call__(self, *exc_info):
|
|
113
|
+
"""
|
|
114
|
+
Executes overriden execpthook.
|
|
115
|
+
|
|
116
|
+
Checks the results from the core's `shouldReportException` function as
|
|
117
|
+
to if the current exception should be reported. (Why? Nuke, for
|
|
118
|
+
example, uses exceptions to signal tradionally non-exception worthy
|
|
119
|
+
events, such as when a user cancels an Open File dialog window.)
|
|
120
|
+
"""
|
|
121
|
+
self.actions = core.shouldReportException(*exc_info, actions=self.actions)
|
|
122
|
+
|
|
123
|
+
self.call_base_excepthook(exc_info)
|
|
124
|
+
self.send_exception_email(exc_info)
|
|
125
|
+
self.send_logger_error(exc_info)
|
|
126
|
+
|
|
127
|
+
ErrorReport.clearReports()
|
|
128
|
+
|
|
129
|
+
def call_base_excepthook(self, exc_info):
|
|
130
|
+
"""
|
|
131
|
+
Process base excepthook supplied during object instantiation.
|
|
132
|
+
|
|
133
|
+
A newline is printed pre-traceback to ensure the first line of output
|
|
134
|
+
is not printed in-line with the prompt. This also provides visual
|
|
135
|
+
separation between tracebacks, when recieved consecutively.
|
|
136
|
+
"""
|
|
137
|
+
print("")
|
|
138
|
+
try:
|
|
139
|
+
self.base_excepthook(*exc_info)
|
|
140
|
+
except (TypeError, NameError):
|
|
141
|
+
sys.__excepthook__(*exc_info)
|
|
142
|
+
|
|
143
|
+
def send_exception_email(self, exc_info):
|
|
144
|
+
"""
|
|
145
|
+
Conditionally sends an exception email.
|
|
146
|
+
"""
|
|
147
|
+
if not self.actions.get("email", False):
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
# email_addresses = os.getenv('BDEV_ERROR_EMAIL')
|
|
151
|
+
# if email_addresses:
|
|
152
|
+
# from .utils.error import ErrorEmail
|
|
153
|
+
# mailer = ErrorEmail(*exc_info)
|
|
154
|
+
# mailer.send(email_addresses)
|
|
155
|
+
|
|
156
|
+
def send_logger_error(self, exc_info):
|
|
157
|
+
"""
|
|
158
|
+
Shows logger prompt.
|
|
159
|
+
"""
|
|
160
|
+
if not self.actions.get("prompt", False):
|
|
161
|
+
return
|
|
162
|
+
|
|
163
|
+
from .gui.console import ConsolePrEdit
|
|
164
|
+
from .gui.errordialog import ErrorDialog
|
|
165
|
+
from .gui.loggerwindow import LoggerWindow
|
|
166
|
+
|
|
167
|
+
instance = LoggerWindow.instance(create=False)
|
|
168
|
+
|
|
169
|
+
if instance:
|
|
170
|
+
# logger reference deleted, fallback and print to console
|
|
171
|
+
if not QtCompat.isValid(instance):
|
|
172
|
+
print("[LoggerWindow] LoggerWindow object has been deleted.")
|
|
173
|
+
print(traceback)
|
|
174
|
+
return
|
|
175
|
+
|
|
176
|
+
# logger is visible and check if it was minimized on windows
|
|
177
|
+
if instance.isVisible() and not instance.isMinimized():
|
|
178
|
+
if instance.uiAutoPromptACT.isChecked():
|
|
179
|
+
instance.console().startInputLine()
|
|
180
|
+
return
|
|
181
|
+
|
|
182
|
+
# error already prompted
|
|
183
|
+
if ConsolePrEdit._errorPrompted:
|
|
184
|
+
return
|
|
185
|
+
|
|
186
|
+
# Preemptively marking error as "prompted" (handled) to avoid errors
|
|
187
|
+
# from being raised multiple times due to C++ and/or threading error
|
|
188
|
+
# processing.
|
|
189
|
+
try:
|
|
190
|
+
ConsolePrEdit._errorPrompted = True
|
|
191
|
+
errorDialog = ErrorDialog(root_window())
|
|
192
|
+
errorDialog.setText(exc_info)
|
|
193
|
+
errorDialog.exec_()
|
|
194
|
+
|
|
195
|
+
# interruptted until dialog closed
|
|
196
|
+
finally:
|
|
197
|
+
ConsolePrEdit._errorPrompted = False
|
|
198
|
+
|
|
199
|
+
@classmethod
|
|
200
|
+
def install(cls, force=False):
|
|
201
|
+
"""
|
|
202
|
+
Install Blur excepthook override, returing previously implemented
|
|
203
|
+
excepthook function.
|
|
204
|
+
|
|
205
|
+
Arguments:
|
|
206
|
+
force (bool): force reinstallation of excepthook override when
|
|
207
|
+
already previously implemented.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
func: pre-override excepthook function
|
|
211
|
+
"""
|
|
212
|
+
ErrorReport.enabled = True
|
|
213
|
+
prev_excepthook = sys.excepthook
|
|
214
|
+
|
|
215
|
+
if not isinstance(prev_excepthook, BlurExcepthook) or force:
|
|
216
|
+
sys.excepthook = cls(prev_excepthook)
|
|
217
|
+
|
|
218
|
+
return prev_excepthook
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# --------------------------------------------------------------------------------
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def printCallingFunction(compact=False):
|
|
225
|
+
"""Prints and returns info about the calling function
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
compact (bool): If set to True, prints a more compact printout
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
str: Info on the calling function.
|
|
232
|
+
"""
|
|
233
|
+
import inspect
|
|
234
|
+
|
|
235
|
+
current = inspect.currentframe().f_back
|
|
236
|
+
try:
|
|
237
|
+
parent = current.f_back
|
|
238
|
+
except AttributeError:
|
|
239
|
+
print('No Calling function found')
|
|
240
|
+
return
|
|
241
|
+
currentInfo = inspect.getframeinfo(current)
|
|
242
|
+
parentInfo = inspect.getframeinfo(parent)
|
|
243
|
+
if parentInfo[3] is not None:
|
|
244
|
+
context = ', '.join(parentInfo[3]).strip('\t').rstrip()
|
|
245
|
+
else:
|
|
246
|
+
context = 'No context to return'
|
|
247
|
+
if compact:
|
|
248
|
+
output = '# %s Calling Function: %s Filename: %s Line: %i Context: %s' % (
|
|
249
|
+
currentInfo[2],
|
|
250
|
+
parentInfo[2],
|
|
251
|
+
parentInfo[0],
|
|
252
|
+
parentInfo[1],
|
|
253
|
+
context,
|
|
254
|
+
)
|
|
255
|
+
else:
|
|
256
|
+
output = ["Function: '%s' in file '%s'" % (currentInfo[2], currentInfo[0])]
|
|
257
|
+
output.append(
|
|
258
|
+
" Calling Function: '%s' in file '%s'" % (parentInfo[2], parentInfo[0])
|
|
259
|
+
)
|
|
260
|
+
output.append(" Line: '%i'" % parentInfo[1])
|
|
261
|
+
output.append(" Context: '%s'" % context)
|
|
262
|
+
output = '\n'.join(output)
|
|
263
|
+
print(output)
|
|
264
|
+
return output
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def mroDump(obj, nice=True, joinString='\n'):
|
|
268
|
+
"""Formats inspect.getmro into text.
|
|
269
|
+
|
|
270
|
+
For the given class object or instance of a class, use inspect to return the Method
|
|
271
|
+
Resolution Order.
|
|
272
|
+
|
|
273
|
+
Args: obj (object): The object to return the mro of. This can be a class object or
|
|
274
|
+
instance.1
|
|
275
|
+
|
|
276
|
+
nice (bool): Returns the same module names as help(object) if True, otherwise
|
|
277
|
+
repr(object).
|
|
278
|
+
|
|
279
|
+
joinString (str, optional): The repr of each class is joined by this string.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
str: A string showing the Method Resolution Order of the given object.
|
|
283
|
+
"""
|
|
284
|
+
import pydoc
|
|
285
|
+
|
|
286
|
+
# getmro requires a class, turn instances into a class
|
|
287
|
+
if not inspect.isclass(obj):
|
|
288
|
+
obj = type(obj)
|
|
289
|
+
classes = inspect.getmro(obj)
|
|
290
|
+
if nice:
|
|
291
|
+
ret = [pydoc.classname(x, obj.__module__) for x in (classes)]
|
|
292
|
+
else:
|
|
293
|
+
ret = [repr(x) for x in (classes)]
|
|
294
|
+
return joinString.join(ret)
|