def test_windowTitleAndTabs_afterSwitchingTab(self, getOpenFileNamesMock): self.window = ReTextWindow() self.window.createNew('') self.window.actionOpen.trigger() processEventsUntilIdle() tab_with_file = self.window.currentTab self.window.createNew('bla') processEventsUntilIdle() tab_with_unsaved_content = self.window.currentTab self.assertEqual('New document[*]', self.window.windowTitle()) self.assertIs(self.window.currentTab, tab_with_unsaved_content) self.assertIs(self.window.tabWidget.currentWidget(), tab_with_unsaved_content) self.assertEqual(self.window.ind, 1) self.assertEqual(self.window.tabWidget.tabText(0), 'existing_file') self.assertEqual(self.window.tabWidget.tabText(1), 'New document*') self.window.switchTab() processEventsUntilIdle() self.assertEqual('existing_file.md[*]', self.window.windowTitle()) self.assertIs(self.window.currentTab, tab_with_file) self.assertIs(self.window.tabWidget.currentWidget(), tab_with_file)
def test_markupDependentWidgetStates_afterStartWithEmptyTabAndRestructuredtextAsDefaultMarkup(self): self.globalSettingsMock.defaultMarkup = 'reStructuredText' self.window = ReTextWindow() self.window.createNew('') processEventsUntilIdle() self.check_widgets_enabled_for_restructuredtext(self.window)
def test_markupDependentWidgetStates_afterLoadingRestructuredtextDocument(self, getOpenFileNamesMock): self.window = ReTextWindow() self.window.createNew('') self.window.actionOpen.trigger() processEventsUntilIdle() self.check_widgets_enabled_for_restructuredtext(self.window)
def main(): app = QApplication(sys.argv) app.setOrganizationName("ReText project") app.setApplicationName("ReText") RtTranslator = QTranslator() if not RtTranslator.load("retext_" + QLocale.system().name(), "locale"): RtTranslator.load("retext_" + QLocale.system().name(), "/usr/share/retext/locale") QtTranslator = QTranslator() QtTranslator.load("qt_" + QLocale.system().name(), QLibraryInfo.location(QLibraryInfo.TranslationsPath)) app.installTranslator(RtTranslator) app.installTranslator(QtTranslator) if settings.contains('appStyleSheet'): stylename = readFromSettings('appStyleSheet', str) sheetfile = QFile(stylename) sheetfile.open(QIODevice.ReadOnly) app.setStyleSheet(QTextStream(sheetfile).readAll()) sheetfile.close() window = ReTextWindow() window.show() fileNames = [QFileInfo(arg).canonicalFilePath() for arg in sys.argv[1:]] for fileName in fileNames: try: fileName = QString.fromUtf8(fileName) except: # Not needed for Python 3 pass if QFile.exists(fileName): window.openFileWrapper(fileName) signal.signal(signal.SIGINT, lambda sig, frame: window.close()) sys.exit(app.exec_())
def test_saveWidgetStates(self, getOpenFileNamesMock, getSaveFileNameMock): self.window = ReTextWindow() # check if save is disabled at first self.window.createNew('') processEventsUntilIdle() self.check_widgets_disabled(self.window, ('actionSave', )) self.assertFalse(self.window.isWindowModified()) # check if it's enabled after inserting some text self.window.currentTab.editBox.textCursor().insertText('some text') processEventsUntilIdle() self.check_widgets_enabled(self.window, ('actionSave', )) self.assertTrue(self.window.isWindowModified()) # check if it's disabled again after loading a file in a second tab and switching to it self.window.actionOpen.trigger() processEventsUntilIdle() self.check_widgets_disabled(self.window, ('actionSave', )) self.assertFalse(self.window.isWindowModified()) # check if it's enabled again after switching back self.window.switchTab() processEventsUntilIdle() self.check_widgets_enabled(self.window, ('actionSave', )) self.assertTrue(self.window.isWindowModified()) # check if it's disabled after saving try: self.window.actionSaveAs.trigger() processEventsUntilIdle() self.check_widgets_disabled(self.window, ('actionSave', )) self.assertFalse(self.window.isWindowModified()) finally: os.remove(os.path.join(path_to_testdata, 'not_existing_file.md'))
def test_markupDependentWidgetStates_afterStartWithEmptyTabAndMarkdownAsDefaultMarkup(self): self.window = ReTextWindow() self.window.createNew('') processEventsUntilIdle() # markdown is the default markup self.check_widgets_enabled_for_markdown(self.window)
def test_saveWidgetStates_autosaveEnabled(self, getOpenFileNamesMock, getSaveFileNameMock): self.globalSettingsMock.autoSave = True self.window = ReTextWindow() # check if save is disabled at first self.window.createNew('') processEventsUntilIdle() self.check_widgets_disabled(self.window, ('actionSave', )) # check if it stays enabled after inserting some text (because autosave # can't save without a filename) self.window.currentTab.editBox.textCursor().insertText('some text') processEventsUntilIdle() self.check_widgets_enabled(self.window, ('actionSave', )) # check if it's disabled after saving try: self.window.actionSaveAs.trigger() processEventsUntilIdle() self.check_widgets_disabled(self.window, ('actionSave', )) # check if it is still disabled after inserting some text (because # autosave will take care of saving now that the filename is known) self.window.currentTab.editBox.textCursor().insertText('some text') processEventsUntilIdle() self.check_widgets_disabled(self.window, ('actionSave', )) finally: os.remove(os.path.join(path_to_testdata, 'not_existing_file.md'))
def test_markupDependentWidgetStates_afterLoadingMarkdownDocument( self, getOpenFileNamesMock): self.window = ReTextWindow() self.window.createNew('') self.window.actionOpen.trigger() app.processEvents() self.check_widgets_enabled_for_markdown(self.window)
def test_windowTitleAndTabs_afterStartWithEmptyTab(self): self.window = ReTextWindow() self.window.createNew('') processEventsUntilIdle() self.assertEqual(1, self.window.tabWidget.count()) self.assertEqual('New document[*]', self.window.windowTitle()) self.assertFalse(self.window.currentTab.fileName)
def test_markupDependentWidgetStates_afterChangingDefaultMarkup(self): self.window = ReTextWindow() self.window.createNew('') processEventsUntilIdle() self.window.setDefaultMarkup(markups.ReStructuredTextMarkup) self.check_widgets_enabled_for_restructuredtext(self.window)
def main(): if markups.__version_tuple__ < (2, ): sys.exit('Error: ReText needs PyMarkups 2.0 or newer to run.') # If we're running on Windows without a console, then discard stdout # and save stderr to a file to facilitate debugging in case of crashes. if sys.executable.endswith('pythonw.exe'): sys.stdout = open(devnull, 'w') sys.stderr = open('stderr.log', 'w') app = QApplication(sys.argv) app.setOrganizationName("ReText project") app.setApplicationName("ReText") app.setApplicationDisplayName("ReText") app.setApplicationVersion(app_version) app.setOrganizationDomain('mitya57.me') if hasattr(app, 'setDesktopFileName'): # available since Qt 5.7 app.setDesktopFileName('me.mitya57.ReText.desktop') QNetworkProxyFactory.setUseSystemConfiguration(True) RtTranslator = QTranslator() for path in datadirs: if RtTranslator.load('retext_' + globalSettings.uiLanguage, join(path, 'locale')): break QtTranslator = QTranslator() QtTranslator.load("qtbase_" + globalSettings.uiLanguage, QLibraryInfo.location(QLibraryInfo.TranslationsPath)) app.installTranslator(RtTranslator) app.installTranslator(QtTranslator) print('Using configuration file:', settings.fileName()) if globalSettings.appStyleSheet: sheetfile = QFile(globalSettings.appStyleSheet) sheetfile.open(QIODevice.ReadOnly) app.setStyleSheet(QTextStream(sheetfile).readAll()) sheetfile.close() window = ReTextWindow() window.show() # ReText can change directory when loading files, so we # need to have a list of canonical names before loading fileNames = list(map(canonicalize, sys.argv[1:])) previewMode = False for fileName in fileNames: if QFile.exists(fileName): window.openFileWrapper(fileName) if previewMode: window.actionPreview.setChecked(True) window.preview(True) elif fileName == '--preview': previewMode = True if globalSettings.openLastFilesOnStartup: window.restoreLastOpenedFiles() inputData = '' if (sys.stdin is None or sys.stdin.isatty()) else sys.stdin.read() if inputData or not window.tabWidget.count(): window.createNew(inputData) signal.signal(signal.SIGINT, lambda sig, frame: window.close()) sys.exit(app.exec())
def test_windowTitleAndTabs_afterLoadingFile(self, getOpenFileNamesMock): self.window = ReTextWindow() self.window.createNew('') self.window.actionOpen.trigger() processEventsUntilIdle() # Check that file is opened in the existing empty tab self.assertEqual(1, self.window.tabWidget.count()) self.assertEqual('existing_file.md[*]', self.window.windowTitle()) self.assertTrue(self.window.currentTab.fileName.endswith('tests/testdata/existing_file.md'))
def test_doesNotTweakSpecialCharacters(self): fileName = tempfile.mkstemp(suffix='.mkd')[1] content = 'Non-breaking\u00a0space\n\nLine\u2028separator\n' with open(fileName, 'w') as tempFile: tempFile.write(content) window = ReTextWindow() window.openFileWrapper(fileName) self.assertTrue(window.saveFile()) with open(fileName) as tempFile: self.assertMultiLineEqual(content, tempFile.read()) os.remove(fileName)
def test_encodingAndReloadWidgetStates(self, getOpenFileNamesMock): self.window = ReTextWindow() # check if reload/set encoding is disabled for a tab without filename set self.window.createNew('') processEventsUntilIdle() self.check_widgets_disabled(self.window, ('actionReload','actionSetEncoding')) self.window.actionOpen.trigger() processEventsUntilIdle() self.check_widgets_enabled(self.window, ('actionReload','actionSetEncoding'))
def test_markupDependentWidgetStates_afterSavingDocumentAsDifferentMarkup(self, getOpenFileNamesMock, getSaveFileNameMock): self.window = ReTextWindow() self.window.createNew('') self.window.actionOpen.trigger() processEventsUntilIdle() try: self.window.actionSaveAs.trigger() processEventsUntilIdle() finally: os.remove(os.path.join(path_to_testdata, 'not_existing_file.rst')) self.check_widgets_enabled_for_restructuredtext(self.window)
def test_markupDependentWidgetStates_afterSwitchingTab(self, getOpenFileNamesMock): self.window = ReTextWindow() self.window.createNew('') self.window.actionOpen.trigger() self.window.actionOpen.trigger() processEventsUntilIdle() # Just to make sure that sending two actionOpen triggers has had the desired effect self.assertIn('.rst', self.window.windowTitle()) self.window.switchTab() processEventsUntilIdle() self.assertIn('.md', self.window.windowTitle()) self.check_widgets_enabled_for_markdown(self.window)
def test_encodingAndReloadWidgetStates_alwaysDisabledWhenAutosaveEnabled( self, getOpenFileNamesMock): self.globalSettingsMock.autoSave = True self.window = ReTextWindow() # check if reload/set encoding is disabled for a tab without filename set self.window.createNew('') app.processEvents() self.check_widgets_disabled(self.window, ('actionReload', 'actionSetEncoding')) self.window.actionOpen.trigger() app.processEvents() self.check_widgets_disabled(self.window, ('actionReload', 'actionSetEncoding'))
def main(): app = QApplication(sys.argv) app.setOrganizationName("ReText project") app.setApplicationName("ReText") app.setApplicationDisplayName("ReText") app.setApplicationVersion(app_version) app.setOrganizationDomain('mitya57.me') if hasattr(app, 'setDesktopFileName'): # available since Qt 5.7 app.setDesktopFileName('me.mitya57.ReText.desktop') QNetworkProxyFactory.setUseSystemConfiguration(True) RtTranslator = QTranslator() for path in datadirs: if RtTranslator.load('retext_' + globalSettings.uiLanguage, join(path, 'locale')): break QtTranslator = QTranslator() QtTranslator.load("qt_" + globalSettings.uiLanguage, QLibraryInfo.location(QLibraryInfo.TranslationsPath)) app.installTranslator(RtTranslator) app.installTranslator(QtTranslator) if globalSettings.appStyleSheet: sheetfile = QFile(globalSettings.appStyleSheet) sheetfile.open(QIODevice.ReadOnly) app.setStyleSheet(QTextStream(sheetfile).readAll()) sheetfile.close() window = ReTextWindow() window.show() # ReText can change directory when loading files, so we # need to have a list of canonical names before loading fileNames = list(map(canonicalize, sys.argv[1:])) previewMode = False for fileName in fileNames: if QFile.exists(fileName): window.openFileWrapper(fileName) if previewMode: window.actionPreview.setChecked(True) window.preview(True) elif fileName == '--preview': previewMode = True inputData = '' if sys.stdin.isatty() else sys.stdin.read() if inputData or not window.tabWidget.count(): window.createNew(inputData) signal.signal(signal.SIGINT, lambda sig, frame: window.close()) sys.exit(app.exec())
def test_activeTab_afterLoadingFileThatIsAlreadyOpenInOtherTab(self, getOpenFileNamesMock): self.window = ReTextWindow() self.window.createNew('') self.window.actionOpen.trigger() processEventsUntilIdle() tab_with_file = self.window.currentTab self.window.createNew('') processEventsUntilIdle() # Make sure that the newly created tab is the active one self.assertFalse(self.window.currentTab.fileName) # Load the same document again self.window.actionOpen.trigger() processEventsUntilIdle() # Check that we have indeed been switched back to the previous tab self.assertIs(self.window.currentTab, tab_with_file) self.assertTrue(self.window.currentTab.fileName.endswith('tests/testdata/existing_file.md'))
def main(): multiprocessing.set_start_method('spawn') if markups.__version_tuple__ < (2, ): sys.exit('Error: ReText needs PyMarkups 2.0 or newer to run.') # If we're running on Windows without a console, then discard stdout # and save stderr to a file to facilitate debugging in case of crashes. if sys.executable.endswith('pythonw.exe'): sys.stdout = open(devnull, 'w') sys.stderr = open('stderr.log', 'w') try: # See https://github.com/retext-project/retext/issues/399 # and https://launchpad.net/bugs/941826 ctypes.CDLL('libGL.so.1', ctypes.RTLD_GLOBAL) except OSError: pass # Needed for Qt WebEngine on Windows QApplication.setAttribute(Qt.AA_ShareOpenGLContexts) app = QApplication(sys.argv) app.setOrganizationName("ReText project") app.setApplicationName("ReText") app.setApplicationDisplayName("ReText") app.setApplicationVersion(app_version) app.setOrganizationDomain('mitya57.me') if hasattr(app, 'setDesktopFileName'): # available since Qt 5.7 app.setDesktopFileName('me.mitya57.ReText.desktop') QNetworkProxyFactory.setUseSystemConfiguration(True) initializeDataDirs() RtTranslator = QTranslator() for path in datadirs: if RtTranslator.load('retext_' + globalSettings.uiLanguage, join(path, 'locale')): break QtTranslator = QTranslator() QtTranslator.load("qtbase_" + globalSettings.uiLanguage, QLibraryInfo.location(QLibraryInfo.TranslationsPath)) app.installTranslator(RtTranslator) app.installTranslator(QtTranslator) print('Using configuration file:', settings.fileName()) if globalSettings.appStyleSheet: sheetfile = QFile(globalSettings.appStyleSheet) sheetfile.open(QIODevice.ReadOnly) app.setStyleSheet(QTextStream(sheetfile).readAll()) sheetfile.close() window = ReTextWindow() window.show() # ReText can change directory when loading files, so we # need to have a list of canonical names before loading fileNames = list(map(canonicalize, sys.argv[1:])) previewMode = False readStdIn = False if globalSettings.openLastFilesOnStartup: window.restoreLastOpenedFiles() for fileName in fileNames: if QFile.exists(fileName): window.openFileWrapper(fileName) if previewMode: window.actionPreview.setChecked(True) window.preview(True) elif fileName == '--preview': previewMode = True elif fileName == '-': readStdIn = True inputData = '' if readStdIn and sys.stdin is not None: if sys.stdin.isatty(): print('Reading stdin, press ^D to end...') inputData = sys.stdin.read() if inputData or not window.tabWidget.count(): window.createNew(inputData) signal.signal(signal.SIGINT, lambda sig, frame: window.close()) sys.exit(app.exec())
def main(): multiprocessing.set_start_method('spawn') if markups.__version_tuple__ < (2, ): sys.exit('Error: ReText needs PyMarkups 2.0 or newer to run.') # If we're running on Windows without a console, then discard stdout # and save stderr to a file to facilitate debugging in case of crashes. if sys.executable.endswith('pythonw.exe'): sys.stdout = open(devnull, 'w') sys.stderr = open('stderr.log', 'w') try: # See https://github.com/retext-project/retext/issues/399 # and https://launchpad.net/bugs/941826 ctypes.CDLL('libGL.so.1', ctypes.RTLD_GLOBAL) except OSError: pass # Needed for Qt WebEngine on Windows QApplication.setAttribute(Qt.ApplicationAttribute.AA_ShareOpenGLContexts) QApplication.setAttribute(Qt.ApplicationAttribute.AA_UseHighDpiPixmaps) app = QApplication(sys.argv) app.setOrganizationName("ReText project") app.setApplicationName("ReText") app.setApplicationDisplayName("ReText") app.setApplicationVersion(app_version) app.setOrganizationDomain('mitya57.me') app.setDesktopFileName('me.mitya57.ReText.desktop') QNetworkProxyFactory.setUseSystemConfiguration(True) initializeDataDirs() RtTranslator = QTranslator() for path in datadirs: if RtTranslator.load('retext_' + globalSettings.uiLanguage, join(path, 'locale')): break QtTranslator = QTranslator() QtTranslator.load("qtbase_" + globalSettings.uiLanguage, QLibraryInfo.location(QLibraryInfo.LibraryLocation.TranslationsPath)) app.installTranslator(RtTranslator) app.installTranslator(QtTranslator) parser = QCommandLineParser() parser.addHelpOption() parser.addVersionOption() previewOption = QCommandLineOption('preview', QApplication.translate('main', 'Open the files in preview mode')) newWindowOption = QCommandLineOption('new-window', QApplication.translate('main', 'Create a new window even if there is an existing one')) parser.addOption(previewOption) parser.addOption(newWindowOption) parser.addPositionalArgument('files', QApplication.translate('main', 'List of files to open'), '[files...]') parser.process(app) filesToOpen = parser.positionalArguments() print('Using configuration file:', settings.fileName()) if globalSettings.appStyleSheet: sheetfile = QFile(globalSettings.appStyleSheet) sheetfile.open(QIODevice.OpenModeFlag.ReadOnly) app.setStyleSheet(QTextStream(sheetfile).readAll()) sheetfile.close() window = ReTextWindow() openInExistingWindow = (globalSettings.openFilesInExistingWindow and not parser.isSet(newWindowOption)) connection = QDBusConnection.sessionBus() if connection.isConnected() and openInExistingWindow: connection.registerObject('/', window, QDBusConnection.RegisterOption.ExportAllSlots) serviceName = 'me.mitya57.ReText' if not connection.registerService(serviceName) and filesToOpen: print('Opening the file(s) in the existing window of ReText.') iface = QDBusInterface(serviceName, '/', '', connection) for fileName in filesToOpen: iface.call('openFileWrapper', fileName) qWidgetIface = QDBusInterface(serviceName, '/', 'org.qtproject.Qt.QWidget', connection) qWidgetIface.call('raise') sys.exit(0) window.show() # ReText can change directory when loading files, so we # need to have a list of canonical names before loading fileNames = list(map(canonicalize, filesToOpen)) readStdIn = False if globalSettings.openLastFilesOnStartup: window.restoreLastOpenedFiles() for fileName in fileNames: if QFile.exists(fileName): window.openFileWrapper(fileName) if parser.isSet(previewOption): window.actionPreview.setChecked(True) window.preview(True) elif fileName == '-': readStdIn = True inputData = '' if readStdIn and sys.stdin is not None: if sys.stdin.isatty(): print('Reading stdin, press ^D to end...') inputData = sys.stdin.read() if inputData or not window.tabWidget.count(): window.createNew(inputData) signal.signal(signal.SIGINT, lambda sig, frame: window.close()) sys.exit(app.exec())