def create_banner(message): """Create internal shell banner""" if message is None: versions = get_versions() return "Python %s %dbits [%s]" % (versions["python"], versions["bitness"], versions["system"]) else: return message
def create_banner(message): """Create internal shell banner""" if message is None: versions = get_versions() return 'Python %s %dbits [%s]'\ % (versions['python'], versions['bitness'], versions['system']) else: return message
def copy_to_clipboard(self): versions = get_versions() QApplication.clipboard().setText( "* Spyder version: {spyder_ver} {revision}\n" "* Python version: {python_ver} {bitness}-bit\n" "* Qt version: {qt_ver}\n" "* {qt_api} version: {qt_api_ver}\n" "* Operating System: {os_name} {os_ver}".format( spyder_ver=versions['spyder'], revision=versions['revision'], python_ver=versions['python'], bitness=versions['bitness'], qt_ver=versions['qt'], qt_api=versions['qt_api'], qt_api_ver=versions['qt_api_ver'], os_name=versions['system'], os_ver=versions['release']))
# Selecting the GUI toolkit: PyQt5 if installed if args.gui is None: try: import PyQt5 # analysis:ignore print("*. PyQt5 is detected, selecting") os.environ['QT_API'] = 'pyqt5' except ImportError: sys.exit("ERROR: No PyQt5 detected!") else: print("*. Skipping GUI toolkit detection") os.environ['QT_API'] = args.gui # Checking versions (among other things, this has the effect of setting the # QT_API environment variable if this has not yet been done just above) from spyder import get_versions versions = get_versions(reporev=True) print("*. Imported Spyder %s - Revision %s, Branch: %s" % (versions['spyder'], versions['revision'], versions['branch'])) print(" [Python %s %dbits, Qt %s, %s %s on %s]" % (versions['python'], versions['bitness'], versions['qt'], versions['qt_api'], versions['qt_api_ver'], versions['system'])) # Check that we have the right qtpy version from spyder.utils import programs if not programs.is_module_installed('qtpy', '>=1.1.0'): print("") sys.exit("ERROR: Your qtpy version is outdated. Please install qtpy " "1.1.0 or higher to be able to work with Spyder!") # --- Executing Spyder
try: import PyQt4 # analysis:ignore print("02. PyQt4 is detected, selecting") os.environ['QT_API'] = 'pyqt' except ImportError: print("02. No PyQt5 or PyQt4 detected, using PySide if available " "(deprecated)") else: print ("02. Skipping GUI toolkit detection") os.environ['QT_API'] = args.gui # Checking versions (among other things, this has the effect of setting the # QT_API environment variable if this has not yet been done just above) from spyder import get_versions versions = get_versions(reporev=False) print("03. Imported Spyder %s" % versions['spyder']) print(" [Python %s %dbits, Qt %s, %s %s on %s]" % \ (versions['python'], versions['bitness'], versions['qt'], versions['qt_api'], versions['qt_api_ver'], versions['system'])) # Check that we have the right qtpy version from spyder.utils import programs if not programs.is_module_installed('qtpy', '>=1.1.0'): print("") sys.exit("ERROR: Your qtpy version is outdated. Please install qtpy " "1.1.0 or higher to be able to work with Spyder!") # --- Executing Spyder
def __init__(self, parent): """Create About Spyder dialog with general information.""" QDialog.__init__(self, parent) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) versions = get_versions() # Show Git revision for development version revlink = '' if versions['revision']: rev = versions['revision'] revlink = ("<a href='https://github.com/spyder-ide/spyder/" "commit/%s'>%s</a>" % (rev, rev)) # Get current font properties font = self.font() font_family = font.family() buttons_padding = DialogStyle.ButtonsPadding buttons_font_size = DialogStyle.ButtonsFontSize font_size = DialogStyle.ContentFontSize dialog_background_color = QStylePalette.COLOR_BACKGROUND_2 twitter_url = "https://twitter.com/Spyder_IDE", facebook_url = "https://www.facebook.com/SpyderIDE", youtube_url = "https://www.youtube.com/Spyder-IDE", instagram_url = "https://www.instagram.com/spyderide/", self.label_overview = QLabel(f""" <div style='font-family: "{font_family}"; font-size: {font_size}; font-weight: normal; '> <br> <p> <b> Spyder IDE</b> <br> <br> The Scientific Python Development Environment | <a href="{website_url}">Spyder-IDE.org</a> <br> <p> Python {versions['python']} {versions['bitness']}-bit | Qt {versions['qt']} | {versions['qt_api']} {versions['qt_api_ver']} | {versions['system']} {versions['release']} </p> <br> <br> <a href="{project_url}">GitHub</a> | <a href="{twitter_url}"> Twitter</a> | <a href="{facebook_url}">Facebook</a> | <a href="{youtube_url}"> YouTube</a> | <a href="{instagram_url}">Instagram</a> </div>""") self.label_community = QLabel(f""" <div style='font-family: "{font_family}"; font-size: {font_size}; font-weight: normal; '> <br> <p> Created by Pierre Raybaut; current maintainer is Carlos Cordoba. Developed by the <a href="{project_url}/graphs/contributors">international Spyder community</a>. Many thanks to all the Spyder beta testers and dedicated users. </p> <p>For help with Spyder errors and crashes, please read our <a href="{trouble_url}">Troubleshooting Guide</a>, and for bug reports and feature requests, visit our <a href="{project_url}">Github site</a>. For project discussion, see our <a href="{forum_url}">Google Group</a>. </p> <p> This project is part of a larger effort to promote and facilitate the use of Python for scientific and engineering software development. The popular Python distributions <a href="https://www.anaconda.com/download/">Anaconda</a> and <a href="https://winpython.github.io/">WinPython</a> also contribute to this plan. </p> </div>""") self.label_legal = QLabel(f""" <div style='font-family: "{font_family}"; font-size: {font_size}; font-weight: normal; '> <br> <p> Copyright © 2009-2020 Spyder Project Contributors and <a href="{project_url}/blob/master/AUTHORS.txt">others</a>. Distributed under the terms of the <a href="{project_url}/blob/master/LICENSE.txt">MIT License</a>. </p> <p> <p>Certain source files under other compatible permissive licenses and/or originally by other authors. Spyder 3 theme icons derived from <a href="https://fontawesome.com/">Font Awesome</a> 4.7 (© 2016 David Gandy; SIL OFL 1.1) and <a href="http://materialdesignicons.com/">Material Design</a> (© 2014 Austin Andrews; SIL OFL 1.1). Most Spyder 2 theme icons sourced from the <a href="https://www.everaldo.com">Crystal Project iconset</a> (© 2006-2007 Everaldo Coelho; LGPL 2.1+). Other icons from <a href="http://p.yusukekamiyamane.com/">Yusuke Kamiyamane</a> (© 2013 Yusuke Kamiyamane; CC-BY 3.0), the <a href="http://www.famfamfam.com/lab/icons/silk/">FamFamFam Silk icon set</a> 1.3 (© 2006 Mark James; CC-BY 2.5), and the <a href="https://www.kde.org/">KDE Oxygen icons</a> (© 2007 KDE Artists; LGPL 3.0+). </p> <p> Splash screen photo by <a href="https://unsplash.com/@benchaccounting?utm_source= unsplash&utm_medium=referral&utm_content=creditCopyText">Bench Accounting</a> on <a href="https://unsplash.com/?utm_source= unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash </a> </p> <p> See the <a href="{project_url}/blob/master/NOTICE.txt">NOTICE</a> file for full legal information. </p> </div> """) for label in [ self.label_overview, self.label_community, self.label_legal ]: label.setWordWrap(True) label.setAlignment(Qt.AlignTop) label.setOpenExternalLinks(True) label.setTextInteractionFlags(Qt.TextBrowserInteraction) label.setContentsMargins(15, 0, 25, 0) icon_filename = "spyder_about" pixmap = QPixmap(get_image_path(icon_filename)) self.label_pic = QLabel(self) self.label_pic.setPixmap( pixmap.scaledToWidth(100, Qt.SmoothTransformation)) self.label_pic.setAlignment(Qt.AlignBottom) self.info = QLabel((""" <div style='font-family: "{font_family}"; font-size: {font_size}; font-weight: normal; '> <p> <b>Spyder IDE</b> <br>{spyder_ver} <br>{revision} <br>({installer}) <br>""").format(spyder_ver=versions['spyder'], revision=revlink, installer=versions['installer'], font_family=font_family, font_size=font_size)) self.info.setAlignment(Qt.AlignHCenter) btn = QPushButton(_("Copy version info"), ) bbox = QDialogButtonBox(QDialogButtonBox.Ok) bbox.setStyleSheet(f"font-size: {buttons_font_size};" f"padding: {buttons_padding}") btn.setStyleSheet(f"font-size: {buttons_font_size};" f"padding: {buttons_padding}") # Widget setup self.setWindowIcon(ima.icon('MessageBoxInformation')) self.setModal(False) # Layout piclayout = QVBoxLayout() piclayout.addWidget(self.label_pic) piclayout.addWidget(self.info) piclayout.setContentsMargins(20, 0, 15, 0) scroll_overview = QScrollArea(self) scroll_overview.setWidgetResizable(True) scroll_overview.setWidget(self.label_overview) scroll_community = QScrollArea(self) scroll_community.setWidgetResizable(True) scroll_community.setWidget(self.label_community) scroll_legal = QScrollArea(self) scroll_legal.setWidgetResizable(True) scroll_legal.setWidget(self.label_legal) self.tabs = QTabWidget() self.tabs.addTab(scroll_overview, _('Overview')) self.tabs.addTab(scroll_community, _('Community')) self.tabs.addTab(scroll_legal, _('Legal')) self.tabs.setStyleSheet(f"background-color: {dialog_background_color}") tabslayout = QHBoxLayout() tabslayout.addWidget(self.tabs) tabslayout.setSizeConstraint(tabslayout.SetFixedSize) tabslayout.setContentsMargins(0, 15, 15, 0) btmhlayout = QHBoxLayout() btmhlayout.addWidget(btn) btmhlayout.addWidget(bbox) btmhlayout.setContentsMargins(100, 20, 0, 20) btmhlayout.addStretch() vlayout = QVBoxLayout() vlayout.addLayout(tabslayout) vlayout.addLayout(btmhlayout) vlayout.setSizeConstraint(vlayout.SetFixedSize) mainlayout = QHBoxLayout(self) mainlayout.addLayout(piclayout) mainlayout.addLayout(vlayout) # Signals btn.clicked.connect(self.copy_to_clipboard) bbox.accepted.connect(self.accept) # Size self.resize(550, 430) # Style css = APP_STYLESHEET.get_copy() css = css.get_stylesheet() css.QDialog.setValues(backgroundColor=dialog_background_color) css.QLabel.setValues(backgroundColor=dialog_background_color) self.setStyleSheet(str(css))
# Define paths THISDIR = Path(__file__).resolve().parent SPYREPO = (THISDIR / '..' / '..').resolve() ICONFILE = SPYREPO / 'img_src' / 'spyder.icns' APPSCRIPT = SPYREPO / 'scripts' / 'spyder' MAC_APP_NAME = 'Spyder.app' APP_BASE_NAME = MAC_APP_NAME[:-4] # Python version PYVER = [ sys.version_info.major, sys.version_info.minor, sys.version_info.micro ] version = get_versions() SPYVER = version['spyder'] SPYCOM = version['revision'] SPYBRA = version['branch'] def make_app_bundle(dist_dir, make_lite=False): """ Make macOS application bundle. Parameters ---------- dist_dir : pathlib.Path Directory in which to put the application bundle. make_lite : bool, optional Whether to create the application bundle with minimal packages.
def __init__(self, parent): """Create About Spyder dialog with general information.""" QDialog.__init__(self, parent) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) versions = get_versions() # Show Git revision for development version revlink = '' if versions['revision']: rev = versions['revision'] revlink = " (<a href='https://github.com/spyder-ide/spyder/" \ "commit/%s'>Commit: %s</a>)" % (rev, rev) # Get current font properties font = self.font() font_family = font.family() font_size = font.pointSize() if sys.platform == 'darwin': font_size -= 2 self.label = QLabel((""" <div style='font-family: "{font_family}"; font-size: {font_size}pt; font-weight: normal; '> <p> <b>Spyder {spyder_ver}</b> {revision} <br> The Scientific Python Development Environment | <a href="{website_url}">Spyder-IDE.org</a> <br> Copyright © 2009-2020 Spyder Project Contributors and <a href="{github_url}/blob/master/AUTHORS.txt">others</a>. <br> Distributed under the terms of the <a href="{github_url}/blob/master/LICENSE.txt">MIT License</a>. </p> <p> Created by Pierre Raybaut; current maintainer is Carlos Cordoba. Developed by the <a href="{github_url}/graphs/contributors">international Spyder community</a>. Many thanks to all the Spyder beta testers and dedicated users. </p> <p>For help with Spyder errors and crashes, please read our <a href="{trouble_url}">Troubleshooting Guide</a>, and for bug reports and feature requests, visit our <a href="{github_url}">Github site</a>. For project discussion, see our <a href="{forum_url}">Google Group</a>. </p> <p> This project is part of a larger effort to promote and facilitate the use of Python for scientific and engineering software development. The popular Python distributions <a href="https://www.anaconda.com/download/">Anaconda</a> and <a href="https://winpython.github.io/">WinPython</a> also contribute to this plan. </p> <p> Python {python_ver} {bitness}-bit | Qt {qt_ver} | {qt_api} {qt_api_ver} | {os_name} {os_ver} </p> <p><small>Certain source files under other compatible permissive licenses and/or originally by other authors. Spyder 3 theme icons derived from <a href="https://fontawesome.com/">Font Awesome</a> 4.7 (© 2016 David Gandy; SIL OFL 1.1) and <a href="http://materialdesignicons.com/">Material Design</a> (© 2014 Austin Andrews; SIL OFL 1.1). Most Spyder 2 theme icons sourced from the <a href="https://www.everaldo.com">Crystal Project iconset</a> (© 2006-2007 Everaldo Coelho; LGPL 2.1+). Other icons from <a href="http://p.yusukekamiyamane.com/">Yusuke Kamiyamane</a> (© 2013 Yusuke Kamiyamane; CC-BY 3.0), the <a href="http://www.famfamfam.com/lab/icons/silk/">FamFamFam Silk icon set</a> 1.3 (© 2006 Mark James; CC-BY 2.5), and the <a href="https://www.kde.org/">KDE Oxygen icons</a> (© 2007 KDE Artists; LGPL 3.0+).</small> </p> <p> See the <a href="{github_url}/blob/master/NOTICE.txt">NOTICE</a> file for full legal information. </p> </div> """).format( spyder_ver=versions['spyder'], revision=revlink, website_url=__website_url__, github_url=__project_url__, trouble_url=__trouble_url__, forum_url=__forum_url__, python_ver=versions['python'], bitness=versions['bitness'], qt_ver=versions['qt'], qt_api=versions['qt_api'], qt_api_ver=versions['qt_api_ver'], os_name=versions['system'], os_ver=versions['release'], font_family=font_family, font_size=font_size, )) self.label.setWordWrap(True) self.label.setAlignment(Qt.AlignTop) self.label.setOpenExternalLinks(True) self.label.setTextInteractionFlags(Qt.TextBrowserInteraction) self.label.setFixedWidth(350) icon_filename = "spyder_about" pixmap = QPixmap(get_image_path(icon_filename)) self.label_pic = QLabel(self) self.label_pic.setPixmap( pixmap.scaledToWidth(64, Qt.SmoothTransformation)) self.label_pic.setAlignment(Qt.AlignTop) btn = QPushButton(_("Copy to clipboard"), ) bbox = QDialogButtonBox(QDialogButtonBox.Ok) # Widget setup self.setWindowIcon(ima.icon('MessageBoxInformation')) self.setModal(False) # Layout tophlayout = QHBoxLayout() tophlayout.addWidget(self.label_pic) tophlayout.addWidget(self.label) btmhlayout = QHBoxLayout() btmhlayout.addWidget(btn) btmhlayout.addStretch() btmhlayout.addWidget(bbox) vlayout = QVBoxLayout(self) vlayout.addLayout(tophlayout) vlayout.addSpacing(25) vlayout.addLayout(btmhlayout) vlayout.setSizeConstraint(vlayout.SetFixedSize) # Signals btn.clicked.connect(self.copy_to_clipboard) bbox.accepted.connect(self.accept)
def render_issue(description='', traceback=''): """ Render issue content. Parameters ---------- description: str Description to include in issue message. traceback: str Traceback text. """ # Get component versions versions = get_versions() # Get dependencies if they haven't beed computed yet. if not dependencies.DEPENDENCIES: try: dependencies.declare_dependencies() except ValueError: pass # Get git revision for development version revision = '' if versions['revision']: revision = versions['revision'] # Make a description header in case no description is supplied if not description: description = "### What steps reproduce the problem?" # Make error section from traceback and add appropriate reminder header if traceback: error_section = ("### Traceback\n" "```python-traceback\n" "{}\n" "```".format(traceback)) else: error_section = '' issue_template = """\ ## Description {description} {error_section} ## Versions * Spyder version: {spyder_version} {commit} * Python version: {python_version} * Qt version: {qt_version} * {qt_api_name} version: {qt_api_version} * Operating System: {os_name} {os_version} ### Dependencies ``` {dependencies} ``` """.format(description=description, error_section=error_section, spyder_version=versions['spyder'], commit=revision, python_version=versions['python'], qt_version=versions['qt'], qt_api_name=versions['qt_api'], qt_api_version=versions['qt_api_ver'], os_name=versions['system'], os_version=versions['release'], dependencies=dependencies.status()) return issue_template
if options.debug: # safety check - Spyder config should not be imported at this point if "spyder.config.base" in sys.modules: sys.exit("ERROR: Can't enable debug mode - Spyder is already imported") print("0x. Switching debug mode on") os.environ["SPYDER_DEBUG"] = "True" # this way of interaction suxx, because there is no feedback # if operation is successful # Checking versions (among other things, this has the effect of setting the # QT_API environment variable if this has not yet been done just above) from spyder import get_versions versions = get_versions(reporev=False) print("03. Imported Spyder %s" % versions['spyder']) print(" [Python %s %dbits, Qt %s, %s %s on %s]" % \ (versions['python'], versions['bitness'], versions['qt'], versions['qt_api'], versions['qt_api_ver'], versions['system'])) # Check that we have the right qtpy version from spyder.utils import programs if not programs.is_module_installed('qtpy', '>=1.1.0'): print("") sys.exit("ERROR: Your qtpy version is outdated. Please install qtpy " "1.1.0 or higher to be able to work with Spyder!") # --- Executing Spyder