class Score(_base.Group, scoreproperties.ScoreProperties): @staticmethod def title(_=_base.translate): return _("Score") def createWidgets(self, layout): self.pieceLabel = QLabel() self.piece = QLineEdit() self.pieceLabel.setBuddy(self.piece) self.opusLabel = QLabel() self.opus = QLineEdit() self.opusLabel.setBuddy(self.opus) self.scoreProps = QGroupBox(checkable=True, checked=False) scoreproperties.ScoreProperties.createWidgets(self) grid = QGridLayout() grid.addWidget(self.pieceLabel, 0 ,0) grid.addWidget(self.piece, 0, 1) grid.addWidget(self.opusLabel, 1, 0) grid.addWidget(self.opus, 1, 1) layout.addLayout(grid) layout.addWidget(self.scoreProps) layout = QVBoxLayout() self.scoreProps.setLayout(layout) scoreproperties.ScoreProperties.layoutWidgets(self, layout) scorewiz = self.scoreProps.window() self.setPitchLanguage(scorewiz.pitchLanguage()) scorewiz.pitchLanguageChanged.connect(self.setPitchLanguage) def translateWidgets(self): self.pieceLabel.setText(_("Piece:")) self.opusLabel.setText(_("Opus:")) self.scoreProps.setTitle(_("Properties")) scoreproperties.ScoreProperties.translateWidgets(self) def accepts(self): return (StaffGroup, _base.Part) def makeNode(self, node): score = ly.dom.Score(node) h = ly.dom.Header() piece = self.piece.text().strip() opus = self.opus.text().strip() if piece: h['piece'] = ly.dom.QuotedString(piece) if opus: h['opus'] = ly.dom.QuotedString(opus) if len(h): score.append(h) return score def globalSection(self, builder): if self.scoreProps.isChecked(): return scoreproperties.ScoreProperties.globalSection(self, builder)
class Score(_base.Group, scoreproperties.ScoreProperties): @staticmethod def title(_=_base.translate): return _("Score") def createWidgets(self, layout): self.pieceLabel = QLabel() self.piece = QLineEdit() self.pieceLabel.setBuddy(self.piece) self.opusLabel = QLabel() self.opus = QLineEdit() self.opusLabel.setBuddy(self.opus) self.scoreProps = QGroupBox(checkable=True, checked=False) scoreproperties.ScoreProperties.createWidgets(self) grid = QGridLayout() grid.addWidget(self.pieceLabel, 0, 0) grid.addWidget(self.piece, 0, 1) grid.addWidget(self.opusLabel, 1, 0) grid.addWidget(self.opus, 1, 1) layout.addLayout(grid) layout.addWidget(self.scoreProps) layout = QVBoxLayout() self.scoreProps.setLayout(layout) scoreproperties.ScoreProperties.layoutWidgets(self, layout) scorewiz = self.scoreProps.window() self.setPitchLanguage(scorewiz.pitchLanguage()) scorewiz.pitchLanguageChanged.connect(self.setPitchLanguage) def translateWidgets(self): self.pieceLabel.setText(_("Piece:")) self.opusLabel.setText(_("Opus:")) self.scoreProps.setTitle(_("Properties")) scoreproperties.ScoreProperties.translateWidgets(self) def accepts(self): return (StaffGroup, _base.Part) def makeNode(self, node): score = ly.dom.Score(node) h = ly.dom.Header() piece = self.piece.text().strip() opus = self.opus.text().strip() if piece: h['piece'] = ly.dom.QuotedString(piece) if opus: h['opus'] = ly.dom.QuotedString(opus) if len(h): score.append(h) return score def globalSection(self, builder): if self.scoreProps.isChecked(): return scoreproperties.ScoreProperties.globalSection(self, builder)
class SphereWidget(QWidget): """ Widget for editing sphere's parameters """ signalObjetChanged = pyqtSignal(SphereParam, name='signal_objet_changed') def __init__(self, parent=None, param=None): super(SphereWidget, self).__init__(parent) if param is None: self.param = SphereParam() else: self.param = param gbC_lay = QVBoxLayout() l_cmap = QLabel("Cmap ") self.cmap = list(get_colormaps().keys()) self.combo = QComboBox(self) self.combo.addItems(self.cmap) self.combo.currentIndexChanged.connect(self.updateParam) self.param.dict["colormap"] = self.cmap[0] hbox = QHBoxLayout() hbox.addWidget(l_cmap) hbox.addWidget(self.combo) gbC_lay.addLayout(hbox) self.sp = [] # subdiv lL = QLabel("subdiv") self.sp.append(QSpinBox()) self.sp[-1].setMinimum(0) self.sp[-1].setMaximum(6) self.sp[-1].setValue(self.param.dict["subdiv"]) # Layout hbox = QHBoxLayout() hbox.addWidget(lL) hbox.addWidget(self.sp[-1]) gbC_lay.addLayout(hbox) # signal's self.sp[-1].valueChanged.connect(self.updateParam) # Banded self.gbBand = QGroupBox(u"Banded") self.gbBand.setCheckable(True) hbox = QGridLayout() lL = QLabel("nbr band", self.gbBand) self.sp.append(QSpinBox(self.gbBand)) self.sp[-1].setMinimum(0) self.sp[-1].setMaximum(100) # Layout hbox = QHBoxLayout() hbox.addWidget(lL) hbox.addWidget(self.sp[-1]) self.gbBand.setLayout(hbox) gbC_lay.addWidget(self.gbBand) # signal's self.sp[-1].valueChanged.connect(self.updateParam) self.gbBand.toggled.connect(self.updateParam) gbC_lay.addStretch(1.0) hbox = QHBoxLayout() hbox.addLayout(gbC_lay) self.setLayout(hbox) self.updateMenu() def updateParam(self, option): """ update param and emit a signal """ tab = ["subdiv", "nbr_band"] for pos, name in enumerate(tab): self.param.dict[name] = self.sp[pos].value() self.param.dict["banded"] = self.gbBand.isChecked() self.param.dict["colormap"] = self.combo.currentText() # emit signal self.signalObjetChanged.emit(self.param) def updateMenu(self, param=None): """ Update menus """ if param is not None: self.param = param # Lock signals self.blockSignals(True) for wid in self.sp: wid.blockSignals(True) tab = ["subdiv", "nbr_band"] for pos, name in enumerate(tab): self.sp[pos].setValue(self.param.dict[name]) self.gbBand.setChecked(self.param.dict["banded"]) # unlock signals self.blockSignals(False) for wid in self.sp: wid.blockSignals(False) self.signalObjetChanged.emit(self.param)
class Main(plugin.Plugin): ' main class for plugin ' def initialize(self, *args, **kwargs): ' class init ' super(Main, self).initialize(*args, **kwargs) self.process = QProcess() self.process.readyReadStandardOutput.connect(self.readOutput) self.process.readyReadStandardError.connect(self.readErrors) self.process.finished.connect(self._process_finished) self.process.error.connect(self._process_finished) # directory auto completer self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.Dirs | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) # menu menu = QMenu('VirtualEnv') menu.addAction('Make VirtualEnv here', lambda: self.make_virtualenv()) self.locator.get_service('explorer').add_project_menu(menu, lang='all') self.group1 = QGroupBox() self.group1.setTitle(' Paths ') self.outdir = QLineEdit(path.expanduser("~")) self.outdir.setPlaceholderText('Target Directory for Virtualenv files') self.outdir.setCompleter(self.completer) self.btn1 = QPushButton(QIcon.fromTheme("document-open"), ' Open ') self.btn1.clicked.connect(lambda: self.outdir.setText(str( QFileDialog.getExistingDirectory(self.dock, 'Please, Open a Target Directory for the Python VirtualEnv...', path.expanduser("~"))))) self.srcdir, self.prefx = QLineEdit(), QLineEdit() self.srcdir.setPlaceholderText( 'Extra search path to look for setuptools/distribute/pip') self.srcdir.setToolTip(''' Specify Extra search path to look for setuptools/distribute/pip. Defaults to Empty, then the setting is ignored.Defaults are OK.''') self.srcdir.setCompleter(self.completer) self.btn2 = QPushButton(QIcon.fromTheme("document-open"), ' Open ') self.btn2.setToolTip( 'Specify Extra search path to look for setuptools/distribute/pip') self.btn2.clicked.connect(lambda: self.srcdir.setText(str( QFileDialog.getExistingDirectory(self.dock, 'Please, Open a Extra search path to look for setuptools/pip...', path.expanduser("~"))))) self.prefx.setPlaceholderText('Prompt prefix for this environment') self.prefx.setToolTip(''' Specify a custom alternative prompt prefix for this environment. Defaults to Empty,this is optional,short prefix are recommended.''') self.btn3 = QPushButton(QIcon.fromTheme("face-smile-big"), 'Suggestion') self.btn3.setToolTip('Suggest me a Random CLI prompt prefix !') self.btn3.clicked.connect(lambda: self.prefx.setText(choice((getuser(), 'tesla', 'einstein', 'turing', 'ritchie', 'darwin', 'curie', 'planck', 'lovelace', 'dijsktra', 'galileo', 'schroedinger', 'perlman', 'hopper', 'newton', 'pasteur', 'maxwell', 'aristotle', 'volta', 'mendelev', 'bohr', 'crick', 'watson', 'archimedes', 'nash', 'fermi', 'dirac', 'feynman', 'kepler', 'copernicus', 'lorentz', 'faraday', 'heisenberg', )))) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( QLabel(' Target directory dath: '), self.outdir, self.btn1, QLabel(' Extra search path: '), self.srcdir, self.btn2, QLabel(' CLI Prompt prefix (Optional): '), self.prefx, self.btn3): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle(' Options ') self.group2.setCheckable(True) self.group2.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group2.graphicsEffect().setEnabled(False) self.group2.toggled.connect(self.toggle_options_group) self.qckb1, self.combo1 = QCheckBox(' Use Debug'), QDoubleSpinBox() self.qckb2 = QCheckBox(' Clear out the target directory') self.qckb3 = QCheckBox(' System-wide Python Packages') self.qckb4 = QCheckBox(' Unzip Setuptool or Distribute to virtualenv') self.qckb5 = QCheckBox(' Force the use of SetupTools') self.qckb6 = QCheckBox(' Never download packages') self.qckb7 = QCheckBox(' Delete .PYC files from virtualenv') self.qckb8 = QCheckBox(' Open target directory later') self.qckb9 = QCheckBox(' Save a LOG file to target later') self.qckb10 = QCheckBox(' No install PIP in the new virtualenv') self.qckb11 = QCheckBox('Save Bash script to reproduce virtenv later') self.chrt = QCheckBox('LOW CPU priority for Backend Process') self.combo1.setValue(2.7) self.combo1.setMaximum(3.4) self.combo1.setMinimum(2.4) self.combo1.setDecimals(1) self.combo1.setSingleStep(0.1) try: self.vinfo = QLabel('<small><b> Virtualenv Version: </b>' + getoutput('virtualenv --version', shell=1).strip()) except: self.vinfo = QLabel('Warning: Failed to query Virtualenv Backend!') [a.setChecked(True) for a in (self.qckb1, self.qckb4, self.qckb7, self.chrt, self.qckb8, self.qckb9, self.qckb11)] vboxg2 = QVBoxLayout(self.group2) for each_widget in (self.qckb1, self.qckb2, self.qckb3, self.qckb4, self.qckb5, self.qckb6, self.qckb7, self.qckb8, self.qckb9, self.qckb10, self.qckb11, QLabel(' Python interpreter version: '), self.combo1, QLabel(' Backend CPU priority: '), self.chrt): vboxg2.addWidget(each_widget) self.button = QPushButton(' Make Virtualenv ') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(75, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) self.output = QTextEdit(''' " Let the future tell the truth, and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine. " -Nikola Tesla. ''') class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((self.group1, self.group2, QLabel('Backend Logs'), self.output, self.vinfo, self.button)) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ExplorerContainer().addTab(self.dock, "Virtualenv") QPushButton(QIcon.fromTheme("help-about"), 'About', self.dock ).clicked.connect(lambda: QMessageBox.information(self.dock, __doc__, HELPMSG)) def readOutput(self): """Read and append sphinx-build output to the logBrowser""" self.output.append(str(self.process.readAllStandardOutput()).strip()) def readErrors(self): """Read and append sphinx-build errors to the logBrowser""" self.output.append(self.formatErrorMsg(str( self.process.readAllStandardError()))) def formatErrorMsg(self, msg): """Format error messages in red color""" return self.formatMsg(msg, 'red') def formatInfoMsg(self, msg): """Format informative messages in blue color""" return self.formatMsg(msg, 'green') def formatMsg(self, msg, color): """Format message with the given color""" return '<font color="{}">{}</font>'.format(color, msg) def make_virtualenv(self): ' make virtualenv from contextual sub menu ' self.outdir.setText(self.ex_locator.get_current_project_item().path) self.run() def run(self): ' run the actions ' self.output.clear() self.output.append(self.formatInfoMsg( 'INFO: OK: Starting at {}'.format(datetime.now()))) self.button.setDisabled(True) # Parse Values arg0 = '' if self.qckb10.isChecked() is False else '--no-pip ' arg1 = '--quiet ' if self.qckb1.isChecked() is False else '--verbose ' arg2 = '' if self.qckb2.isChecked() is False else '--clear ' arg3 = '' if self.qckb3.isChecked() is False else '--system-site-packages ' arg4 = '' if self.qckb4.isChecked() is False else '--unzip-setuptools ' arg5 = '' if self.qckb5.isChecked() is False else '--setuptools ' arg6 = '' if self.qckb6.isChecked() is False else '--never-download ' # if the target is empty return if not len(str(self.outdir.text()).strip()): self.output.append(self.formatErrorMsg('ERROR: FAIL: Target empty')) self.button.setEnabled(True) return else: self.output.append(self.formatInfoMsg( 'INFO: OK: Output Directory is {}'.format(self.outdir.text()))) # prefix prf = str(self.prefx.text()).upper().strip().replace(' ', '') arg10 = '' if prf is '' else '--prompt="{}_" '.format(prf) self.output.append(self.formatInfoMsg('INFO: Prefix: {}'.format(arg10))) # extra search dir src = str(self.srcdir.text()).strip() arg11 = '' if src is '' else '--extra-search-dir="{}" '.format(src) self.output.append(self.formatInfoMsg(' INFO: Extra: {}'.format(arg11))) self.output.append(self.formatInfoMsg( ' INFO: OK: Write Logs ?: {} '.format(self.qckb9.isChecked()))) self.output.append(self.formatInfoMsg( ' INFO: OK: Open Directory ?: {} '.format(self.qckb8.isChecked()))) # run the subprocesses cmd = '{}virtualenv {}{}{}{}{}{}{}-p python{} {}{} {}'.format( 'chrt --verbose -i 0 ' if self.chrt.isChecked() is True else '', arg0, arg1, arg2, arg3, arg4, arg5, arg6, self.combo1.value(), arg11, arg10, str(self.outdir.text()).strip()) self.output.append(self.formatInfoMsg('INFO:OK:Command:{}'.format(cmd))) self.process.start(cmd) if not self.process.waitForStarted(): self.output.append(self.formatErrorMsg(' ERROR: FAIL: Meh. ')) self.output.append(self.formatErrorMsg( 'ERROR: FAIL: Failed with Arguments: {} '.format(cmd))) self.button.setEnabled(True) return # write a .sh bash script file on target if self.qckb11.isChecked() is True: sh_file = 'create_virtualenv.sh' with open(path.join(str(self.outdir.text()), sh_file), 'w') as _sh: self.output.append(self.formatInfoMsg('''INFO: OK: Writing Bash: {}'''.format(path.join(str(self.outdir.text()), sh_file)))) _sh.write('#!/usr/bin/env bash' + linesep + cmd) _sh.close() self.output.append(self.formatInfoMsg('INFO: OK: Bash chmod: 775')) try: chmod(path.join(str(self.outdir.text()), sh_file), 0775) # Py2 except: chmod(path.join(str(self.outdir.text()), sh_file), 0o775) # Py3 self.readOutput() self.readErrors() self.button.setEnabled(True) def _process_finished(self): """ finished sucessfully """ self.output.append(self.formatInfoMsg( 'INFO: OK: Finished at {}'.format(datetime.now()))) # remove all *.PYC bytecode if self.qckb7.isChecked() is True: self.output.append(self.formatInfoMsg(' INFO: OK: Removing *.PYC ')) self.output.append(self.formatInfoMsg(' INFO: This takes a moment')) [remove(path.join(root, f)) for root, f in list(itertools.chain(* [list(itertools.product([root], files)) for root, dirs, files in walk(str(self.outdir.text()).strip())])) if f.endswith(('.pyc', '.PYC')) and not f.startswith('.')] # write a .log file on target if self.qckb9.isChecked() is True: log_file = 'virtualenv_gui.log' with open(path.join(str(self.outdir.text()), log_file), 'w') as log: self.output.append(self.formatInfoMsg('''INFO: OK: Writing Logs: {}'''.format(path.join(str(self.outdir.text()), log_file)))) log.write(self.output.toPlainText()) log.close() # open target dir if self.qckb8.isChecked() is True: try: startfile(str(self.outdir.text())) except: Popen(["xdg-open", str(self.outdir.text())]) self.output.selectAll() self.output.setFocus() def toggle_options_group(self): ' toggle on off the options group ' if self.group2.isChecked() is True: [a.setChecked(True) for a in (self.qckb1, self.qckb4, self.qckb7, self.chrt, self.qckb8, self.qckb9, self.qckb11)] self.combo1.setValue(2.7) self.group2.graphicsEffect().setEnabled(False) else: [a.setChecked(False) for a in (self.qckb1, self.qckb4, self.qckb7, self.chrt, self.qckb8, self.qckb9, self.qckb11)] self.group2.graphicsEffect().setEnabled(True) def finish(self): ' clear when finish ' self.process.kill()
class Main(plugin.Plugin): ' main class for plugin ' def initialize(self, *args, **kwargs): ' class init ' super(Main, self).initialize(*args, **kwargs) self.process = QProcess() self.process.readyReadStandardOutput.connect(self.readOutput) self.process.readyReadStandardError.connect(self.readErrors) self.process.finished.connect(self._process_finished) self.process.error.connect(self._process_finished) # directory auto completer self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.Dirs | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) menu = QMenu('Clones') menu.addAction('Analyze for Code Clones here', lambda: self.make_clon()) self.locator.get_service('explorer').add_project_menu(menu, lang='all') self.group1 = QGroupBox() self.group1.setTitle(' Target ') self.outdir, self.igndir = QLineEdit(path.expanduser("~")), QLineEdit() self.outdir.setCompleter(self.completer) self.btn1 = QPushButton(QIcon.fromTheme("document-open"), ' Open ') self.btn1.clicked.connect(lambda: self.outdir.setText(str( QFileDialog.getExistingDirectory(self.dock, 'Please, Open a Target Directory...', path.expanduser("~"))))) self.btn1a = QPushButton(QIcon.fromTheme("face-smile"), 'Get from Ninja active project') self.btn1a.clicked.connect(lambda: self.outdir.setText( self.locator.get_service('explorer').get_current_project_item().path)) self.ignckb, self.ignmor = QComboBox(), QTextEdit() self.ignckb.addItems(['Single Directory', 'Multiple Directories CSV']) self.ignckb.currentIndexChanged.connect(self.on_ignore_changed) self.ignmor.hide() self.igndir.setPlaceholderText('Exclude directory') self.igndir.setCompleter(self.completer) self.btn2 = QPushButton(QIcon.fromTheme("document-open"), ' Open ') self.btn2.clicked.connect(lambda: self.igndir.setText(str( QFileDialog.getExistingDirectory(self.dock, 'Please, Open a Ignore Directory...', path.expanduser("~"))))) vboxg1 = QVBoxLayout(self.group1) for each_widget in (QLabel('<b>Target directory path: '), self.outdir, self.btn1, self.btn1a, QLabel('<b>Ignore directory path: '), self.ignckb, self.ignmor, self.igndir, self.btn2, ): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle(' Output ') self.outfle = QLineEdit(path.join(path.expanduser("~"), 'output.html')) self.outfle.setPlaceholderText('Exclude directory') self.outfle.setCompleter(self.completer) self.btn3 = QPushButton(QIcon.fromTheme("document-save"), ' Save ') self.btn3.clicked.connect(lambda: self.outfle.setText( QFileDialog.getSaveFileName(self.dock, 'Save', path.expanduser("~"), 'XML(*.xml)' if self.xmlo.isChecked() is True else 'HTML(*.html)'))) vboxg2 = QVBoxLayout(self.group2) for each_widget in (QLabel('<b>Output report file path:'), self.outfle, self.btn3): vboxg2.addWidget(each_widget) self.group3 = QGroupBox() self.group3.setTitle(' Options ') self.group3.setCheckable(True) self.group3.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group3.graphicsEffect().setEnabled(False) self.group3.toggled.connect(self.toggle_options_group) self.qckb1, self.qckb2 = QCheckBox('Recursive'), QCheckBox('Time-less') self.qckb3, self.qckb4 = QCheckBox('Force Diff'), QCheckBox('Fast Mode') self.qckb5, self.tm = QCheckBox('Save a LOG file to target'), QLabel('') self.xmlo = QCheckBox('XML Output instead of HTML') self.opeo = QCheckBox('Open Clones Report when done') self.chrt = QCheckBox('LOW CPU priority for Backend Process') self.mdist, self.hdep, self.output = QSpinBox(), QSpinBox(), QTextEdit() self.ign_func = QLineEdit('test, forward, backward, Migration') self.mdist.setValue(5) self.hdep.setValue(1) self.mdist.setToolTip('''<b>Maximum amount of difference between pair of sequences in clone pair (5 default).Larger value more false positive''') self.hdep.setToolTip('''<b>Computation can be speeded up by increasing this value, but some clones can be missed (1 default)''') [a.setChecked(True) for a in (self.qckb1, self.qckb3, self.qckb5, self.chrt, self.opeo)] vboxg3 = QVBoxLayout(self.group3) for each_widget in (self.qckb1, self.qckb2, self.qckb3, self.qckb4, self.qckb5, self.chrt, self.xmlo, self.opeo, QLabel('<b>Max Distance Threshold:'), self.mdist, QLabel('<b>Max Hashing Depth:'), self.hdep, QLabel('<b>Ignore code block prefix:'), self.ign_func): vboxg3.addWidget(each_widget) self.group4, self.auto = QGroupBox(), QComboBox() self.group4.setTitle(' Automation ') self.group4.setCheckable(True) self.group4.setToolTip('<font color="red"><b>WARNING:Advanced Setting!') self.group4.toggled.connect(lambda: self.group4.hide()) self.auto.addItems(['Never run automatically', 'Run when File Saved', 'Run when File Executed', 'Run when Tab Changed', 'Run when File Opened', 'Run before File Saved']) self.auto.currentIndexChanged.connect(self.on_auto_changed) QVBoxLayout(self.group4).addWidget(self.auto) self.button = QPushButton(' Analyze for Clones ') self.button.setMinimumSize(75, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) self.butkil = QPushButton(' Force Kill Clones ') self.butkil.clicked.connect(lambda: self.process.kill()) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((QLabel('<i>D.R.Y. principle analyzer'), self.group1, self.group2, self.group3, self.group4, QLabel('<b>Backend Logs'), self.output, self.tm, self.button, self.butkil)) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ExplorerContainer().addTab(self.dock, "Clones") QPushButton(QIcon.fromTheme("help-about"), 'About', self.dock ).clicked.connect(lambda: QMessageBox.information(self.dock, __doc__, HELPMSG)) def readOutput(self): """Read and append output to the logBrowser""" self.output.append(str(self.process.readAllStandardOutput()).strip()) def readErrors(self): """Read and append errors to the logBrowser""" self.output.append(self.formatErrorMsg(str( self.process.readAllStandardError()))) def formatErrorMsg(self, msg): """Format error messages in red color""" return self.formatMsg(msg, 'red') def formatInfoMsg(self, msg): """Format informative messages in blue color""" return self.formatMsg(msg, 'green') def formatMsg(self, msg, color): """Format message with the given color""" return '<font color="{}">{}</font>'.format(color, msg) def make_clon(self): ' make clones analyze from contextual sub menu ' self.outdir.setText( self.locator.get_service('explorer').get_current_project_item().path) self.run() def run(self): ' run the actions ' self.output.clear() self.output.append(self.formatInfoMsg('INFO:{}'.format(datetime.now()))) self.tm.setText('<center><b>Last Clone: </b>' + datetime.now().isoformat().split('.')[0]) self.button.setDisabled(True) if not len(self.outdir.text()) and not len(self.outfle.text()): self.output.append(self.formatErrorMsg('ERROR: FAIL: Target empty')) self.button.setEnabled(True) return # run the subprocesses cmd = ' '.join(( 'chrt -i 0' if self.chrt.isChecked() is True else '', 'clonedigger', '' if self.qckb1.isChecked() is True else '--no-recursion', '--dont-print-time' if self.qckb2.isChecked() is True else '', '--force' if self.qckb3.isChecked() is True else '', '--fast' if self.qckb4.isChecked() is True else '', '--cpd-output' if self.xmlo.isChecked() is True else '', '' if self.xmlo.isChecked() is True else '--report-unifiers', '--distance-threshold={}'.format(self.mdist.value()), '--hashing-depth={}'.format(self.hdep.value()), '--ignore-dir="{}"'.format(self.igndir.text() if self.ignckb.currentIndex() is 0 else self.ignmor.toPlainText()), '--func-prefixes="{}"'.format(self.ign_func.text()), '--output="{}"'.format(self.outfle.text()), '--language=python', path.abspath(self.outdir.text()), )) self.output.append(self.formatInfoMsg('INFO:OK:Command:{}'.format(cmd))) self.process.start(cmd) if not self.process.waitForStarted(): self.output.append(self.formatErrorMsg(' ERROR: FAIL: Meh. ')) self.output.append(self.formatErrorMsg('ERROR:FAIL:{}'.format(cmd))) self.button.setEnabled(True) return self.readOutput() self.readErrors() self.button.setEnabled(True) def _process_finished(self): """ finished sucessfully """ self.output.append(self.formatInfoMsg('INFO:{}'.format(datetime.now()))) # write a .log file on target if self.qckb5.isChecked() is True: log_file = 'ninja_clones.log' with open(path.join(str(self.outdir.text()), log_file), 'w') as log: self.output.append(self.formatInfoMsg('''INFO: OK: Writing Logs: {}'''.format(path.join(str(self.outdir.text()), log_file)))) log.write(self.output.toPlainText()) log.close() # open target output if self.opeo.isChecked() is True and self.xmlo.isChecked() is False: try: startfile(self.outfle.text()) except: Popen(["xdg-open", self.outfle.text()]) self.output.selectAll() self.output.setFocus() def toggle_options_group(self): ' toggle on off the options group ' if self.group3.isChecked() is True: [a.setChecked(True) for a in (self.qckb1, self.qckb3, self.qckb5, self.chrt, self.opeo)] self.mdist.setValue(5) self.hdep.setValue(1) self.group3.graphicsEffect().setEnabled(False) else: [a.setChecked(False) for a in (self.qckb1, self.qckb3, self.qckb5, self.chrt, self.opeo)] self.group3.graphicsEffect().setEnabled(True) def on_ignore_changed(self): 'hide or show one widget or another depending what kind of input need' if self.ignckb.currentIndex() is 0: self.igndir.show() self.btn2.show() self.ignmor.hide() else: self.igndir.hide() self.btn2.hide() self.ignmor.show() def on_auto_changed(self): ' automation connects ' if self.auto.currentIndex() is 1: self.locator.get_service('editor').fileSaved.connect(lambda: self.run()) QMessageBox.information(self.dock, __doc__, '<b>Now Actions will Run Automatically when any File is Saved !') elif self.auto.currentIndex() is 2: self.locator.get_service('editor').fileExecuted.connect(lambda: self.run()) QMessageBox.information(self.dock, __doc__, '<b>Now Actions will Run Automatically when any File is Executed !') elif self.auto.currentIndex() is 3: self.locator.get_service('editor').currentTabChanged.connect(lambda: self.run()) QMessageBox.information(self.dock, __doc__, '<b>Now Actions will Run Automatically when current Tab is Changed') elif self.auto.currentIndex() is 4: self.locator.get_service('editor').fileOpened.connect(lambda: self.run()) QMessageBox.information(self.dock, __doc__, '<b>Now Actions will Run Automatically when any File is Opened !') elif self.auto.currentIndex() is 5: self.locator.get_service('editor').beforeFileSaved.connect(lambda: self.run()) QMessageBox.information(self.dock, __doc__, '<b>Now Actions will Run Automatically before any File is Saved !') self.group4.setDisabled(True) def finish(self): ' clear when finish ' self.process.kill()
class LeadSheet(VocalPart, _base.ChordNames): @staticmethod def title(_=_base.translate): return _("Lead sheet") def createWidgets(self, layout): self.label = QLabel(wordWrap=True) self.chords = QGroupBox(checkable=True, checked=True) layout.addWidget(self.label) layout.addWidget(self.chords) box = QVBoxLayout() self.chords.setLayout(box) _base.ChordNames.createWidgets(self, box) self.accomp = QCheckBox() layout.addWidget(self.accomp) VocalPart.createWidgets(self, layout) def translateWidgets(self): VocalPart.translateWidgets(self) _base.ChordNames.translateWidgets(self) self.label.setText('<i>{0}</i>'.format(_( "The Lead Sheet provides a staff with chord names above " "and lyrics below it. A second staff is optional."))) self.chords.setTitle(_("Chord names")) self.accomp.setText(_("Add accompaniment staff")) self.accomp.setToolTip(_( "Adds an accompaniment staff and also puts an accompaniment " "voice in the upper staff.")) def build(self, data, builder): """Create chord names, song and lyrics. Optionally a second staff with a piano accompaniment. """ if self.chords.isChecked(): _base.ChordNames.build(self, data, builder) if self.accomp.isChecked(): p = ly.dom.ChoirStaff() #TODO: instrument names ? #TODO: different midi instrument for voice and accompaniment ? s = ly.dom.Sim(p) mel = ly.dom.Sim(ly.dom.Staff(parent=s)) v1 = ly.dom.Voice(parent=mel) s1 = ly.dom.Seq(v1) ly.dom.Text('\\voiceOne', s1) a = data.assignMusic('melody', 1) ly.dom.Identifier(a.name, s1) s2 = ly.dom.Seq(ly.dom.Voice(parent=mel)) ly.dom.Text('\\voiceTwo', s2) a = data.assignMusic('accRight', 0) ly.dom.Identifier(a.name, s2) acc = ly.dom.Seq(ly.dom.Staff(parent=s)) ly.dom.Clef('bass', acc) a = data.assignMusic('accLeft', -1) ly.dom.Identifier(a.name, acc) if self.ambitus.isChecked(): # We can't use \addlyrics when the voice has a \with {} # section, because it creates a nested Voice context. # So if the ambitus engraver should be added to the Voice, # we don't use \addlyrics but create a new Lyrics context. # So in that case we don't use addStanzas, but insert the # Lyrics contexts manually inside our ChoirStaff. v1.cid = ly.dom.Reference('melody') ly.dom.Line('\\consists "Ambitus_engraver"', v1.getWith()) count = self.stanzas.value() # number of stanzas if count == 1: l = ly.dom.Lyrics() s.insert_before(acc.parent(), l) a = self.assignLyrics(data, 'verse') ly.dom.Identifier(a.name, ly.dom.LyricsTo(v1.cid, l)) else: for i in range(count): l = ly.dom.Lyrics() s.insert_before(acc.parent(), l) a = self.assignLyrics(data, 'verse', i + 1) ly.dom.Identifier(a.name, ly.dom.LyricsTo(v1.cid, l)) else: self.addStanzas(data, v1) else: a = data.assignMusic('melody', 1) p = ly.dom.Staff() ly.dom.Identifier(a.name, ly.dom.Seq(p)) self.addStanzas(data, p) if self.ambitus.isChecked(): ly.dom.Line('\\consists "Ambitus_engraver"', p.getWith()) data.nodes.append(p)
class NetWorkSettingWidget(QWidget): def __init__(self, app, parent = None): super(NetWorkSettingWidget,self).__init__(parent) self.setStyleSheet("font-size : 16px;") self.app = app CDLL("../lib/libjson-c.so", mode=RTLD_GLOBAL) self.jytcapi = cdll.LoadLibrary('../lib/libjytcapi.so') self.jytcapi.jyinittcapi() self.initLayout() self.initCheckBoxStatus() self.restartNetworkTD = RestartNetworkThread() self.waitingDlg = InfoHintDialog(None) #绑定信号 self.connect(self.autoGetIpCheckbox, SIGNAL("stateChanged(int)"),self.slotSettingDHCPType) self.connect(self.staticIpGroupbox, SIGNAL("clicked(bool)"),self.slotSettingStaticType) self.connect(self.autoGetDNSCheckBox, SIGNAL("stateChanged(int)"),self.slotSettingDNSType) self.connect(self.dnsServerAddressGroupbox, SIGNAL("clicked(bool)"),self.slotSettingCustomDNSType) self.connect(self.saveBtn, SIGNAL("clicked()"),self.slotSave) self.connect(self.restartNetworkTD, SIGNAL("restartNetwork"),self.slotShowRestartNetworkInfo) def initLayout(self): #IP设置 self.autoGetIpCheckbox = QCheckBox(self.tr("Auto get IP")) self.staticIpGroupbox = QGroupBox(self.tr("Use this IP")) self.staticIpGroupbox.setCheckable(True) self.ipLabel = QLabel(self.tr("IP address")) self.netmastLabel = QLabel(self.tr("Net mask")) self.defaultGatewayLabel = QLabel(self.tr("Default gateway")) topSpaceWidget = QLabel() topSpaceWidget.setFixedHeight(1) self.ip = QLineEdit() self.ip.setContextMenuPolicy(Qt.NoContextMenu) self.ip.setFixedSize(400, 30) self.netmast = QLineEdit() self.netmast.setContextMenuPolicy(Qt.NoContextMenu) self.defaultGateway = QLineEdit() self.defaultGateway.setContextMenuPolicy(Qt.NoContextMenu) topGridLayout = QGridLayout() topGridLayout.setSpacing(15) topGridLayout.setMargin(20) topGridLayout.addWidget(self.ipLabel, 0, 0, 1, 1) topGridLayout.addWidget(self.ip, 0, 1, 1, 1) topGridLayout.addWidget(self.netmastLabel, 1, 0, 1, 1) topGridLayout.addWidget(self.netmast, 1, 1, 1, 1) topGridLayout.addWidget(self.defaultGatewayLabel, 2, 0, 1, 1) topGridLayout.addWidget(self.defaultGateway, 2, 1, 1, 1) topGridLayout.addWidget(topSpaceWidget, 3, 0, 1, 1) self.staticIpGroupbox.setLayout(topGridLayout) #DNS设置 self.autoGetDNSCheckBox = QCheckBox(self.tr("Auto Get DNS")) self.dnsServerAddressGroupbox = QGroupBox(self.tr("Use This DNS")) self.dnsServerAddressGroupbox.setCheckable(True) self.dnsLabel = QLabel(self.tr("DNS")) self.backupDnsLabel = QLabel(self.tr("Backup DNS")) bottomSpaceWidget = QLabel() bottomSpaceWidget.setFixedHeight(1) self.dns = QLineEdit() self.dns.setContextMenuPolicy(Qt.NoContextMenu) self.backupDns = QLineEdit() self.backupDns.setContextMenuPolicy(Qt.NoContextMenu) self.saveBtn = QPushButton(self.tr("Save")) self.saveBtn.setStyleSheet("background: rgb(7,87,198); color: white; width: 90px; height: 30px;font-size : 16px;") bottomGridLayout = QGridLayout() bottomGridLayout.setSpacing(15) bottomGridLayout.setMargin(20) bottomGridLayout.addWidget(self.dnsLabel, 0, 0, 1, 1) bottomGridLayout.addWidget(self.dns, 0, 1, 1, 1) bottomGridLayout.addWidget(self.backupDnsLabel, 1, 0, 1, 1) bottomGridLayout.addWidget(self.backupDns, 1, 1, 1, 1) bottomGridLayout.addWidget(bottomSpaceWidget, 2, 0, 1, 1) self.dnsServerAddressGroupbox.setLayout(bottomGridLayout) #布局调整 vLayout = QVBoxLayout() vLayout.setSpacing(10) vLayout.setMargin(10) vLayout.addWidget(self.autoGetIpCheckbox) vLayout.addWidget(self.staticIpGroupbox) vLayout.addSpacing(15) vLayout.addWidget(self.autoGetDNSCheckBox) vLayout.addWidget(self.dnsServerAddressGroupbox) vLayout.addStretch() topMainLayout = QHBoxLayout() topMainLayout.addStretch() topMainLayout.addSpacing(50) topMainLayout.addLayout(vLayout) topMainLayout.addStretch(2) bottomHLayout = QHBoxLayout() bottomHLayout.addStretch() bottomHLayout.addWidget(self.saveBtn) bottomHLayout.addStretch() mainVLayout = QVBoxLayout() mainVLayout.addLayout(topMainLayout) mainVLayout.addSpacing(10) mainVLayout.addLayout(bottomHLayout) self.setLayout(mainVLayout) def updateWindow(self): self.autoGetDNSCheckBox.setText(self.tr("Auto Get DNS")) self.autoGetIpCheckbox.setText(self.tr("Auto get IP")) self.dnsServerAddressGroupbox.setTitle(self.tr("Use This DNS")) self.staticIpGroupbox.setTitle(self.tr("Use this IP")) self.ipLabel.setText(self.tr("IP address")) self.netmastLabel.setText(self.tr("Net mask")) self.defaultGatewayLabel.setText(self.tr("Gate way")) self.dnsLabel.setText(self.tr("DNS")) self.backupDnsLabel.setText(self.tr("Backup DNS")) self.saveBtn.setText(self.tr("Save")) def slotShowRestartNetworkInfo(self, status): """显示重启网络的状态信息""" language = StoreInfoParser.instance().getLanguage() m_pTranslator = QTranslator() exePath = "./" if language == "chinese": QmName = "zh_CN.qm" else: QmName = "en_US.qm" if(m_pTranslator.load(QmName, exePath)): QCoreApplication.instance().installTranslator(m_pTranslator) """显示重启网络的状态信息""" if status == "Start": self.waitingDlg.setHintInfo(self.tr("network is restarting, waiting...")) elif status == "Success": self.waitingDlg.setHintInfo(self.tr("network start success!")) vmtype = StoreInfoParser.instance().getVmType() if vmtype == "offline": pass elif status == "Failed": self.waitingDlg.setHintInfo(self.tr("network restart failed!")) else: return if self.waitingDlg.isHidden(): self.waitingDlg.exec_() def slotSave(self): language = StoreInfoParser.instance().getLanguage() m_pTranslator = QTranslator() exePath = "./" if language == "chinese": QmName = "zh_CN.qm" else: QmName = "en_US.qm" if(m_pTranslator.load(QmName, exePath)): QCoreApplication.instance().installTranslator(m_pTranslator) if not self.checkInputValid(): return if self.autoGetIpCheckbox.isChecked(): netconf = self.setDynamicNetwork() elif self.staticIpGroupbox.isChecked(): netconf = self.setStaticNetwork() #重新启动网络 self.restartNetworkTD.setNetConf(netconf) self.restartNetworkTD.start() return def getCmdExecValueT(self, cmd): """得到命令执行的结果""" statusOutput = commands.getstatusoutput(cmd) monitorList = statusOutput[1].split("\n") return monitorList def getNetDnsType(self): typeList = ["dhcp","dhcp"] networkInfo = self.getCmdExecValueT("../lib/ccr_jytcapi network") for item in networkInfo: if len(item.split(":")) == 2: if item.split(":")[0] == "conf": if item.split(":")[1] == "0": typeList[0] = "dhcp" else: typeList[0] = "static" else: pass DNSStatus = StoreInfoParser.instance().getDNSStatus() if DNSStatus == None: pass else: typeList[1] = DNSStatus return typeList def getNetStatic(self): netList = ["0.0.0.0","255.255.255.0","1.1.1.1"] networkInfo = self.getCmdExecValueT("../lib/ccr_jytcapi network") for item in networkInfo: if len(item.split(":")) == 2: if item.split(":")[0] == "ip": netList[0] = item.split(":")[1] elif item.split(":")[0] == "mask": netList[1] = item.split(":")[1] elif item.split(":")[0] == "gateway": netList[2] = item.split(":")[1] return netList def getDnsStatic(self): dnsList = ["0.0.0.0","2.5.5.0"] networkInfo = self.getCmdExecValueT("../lib/ccr_jytcapi network") for item in networkInfo: if len(item.split(":")) == 2: if item.split(":")[0] == "dns1": dnsList[0] = item.split(":")[1] elif item.split(":")[0] == "dns2": dnsList[1] = item.split(":")[1] return dnsList def initCheckBoxStatus(self): """读取网络配置文件,初始化相应的checkbox的状态""" [netType, DNSType] = self.getNetDnsType() if netType == "dhcp": self.autoGetIpCheckbox.setChecked(True) self.staticIpGroupbox.setChecked(False) self.autoGetDNSCheckBox.setEnabled(False) self.dnsServerAddressGroupbox.setEnabled(False) else: self.autoGetIpCheckbox.setChecked(False) self.staticIpGroupbox.setChecked(True) self.autoGetDNSCheckBox.setEnabled(True) self.dnsServerAddressGroupbox.setEnabled(True) [ip, netmask, gateway] = self.getNetStatic() if ip: self.ip.setText(ip) if netmask: self.netmast.setText(netmask) if gateway: self.defaultGateway.setText(gateway) if DNSType == "dhcp": self.autoGetDNSCheckBox.setChecked(True) self.dnsServerAddressGroupbox.setChecked(False) else: self.autoGetDNSCheckBox.setChecked(False) self.dnsServerAddressGroupbox.setChecked(True) [DNS_first, DNS_second] = self.getDnsStatic() if DNS_first: self.dns.setText(DNS_first) if DNS_second: self.backupDns.setText(DNS_second) def getCustomDNSInfo(self): """得到自定义DNS的内容""" DNS_first = None DNS_second = None statusOutput = commands.getstatusoutput("cat %s" % common.NETWORK_CONFIG_UBUNTU) if statusOutput[0] == 0: outputList = QString(statusOutput[1]).split("\n") for value in outputList: if value.split(" ")[0] == "dns-nameservers": DNS_first = value.split(" ")[1] if len(value.split(" ")) > 2: DNS_second = value.split(" ")[2] return [DNS_first, DNS_second] def getStaticNetworkInfo(self): """得到静态网络的信息""" ip = netmask = gateway = None statusOutput = commands.getstatusoutput("cat %s" % common.NETWORK_CONFIG_UBUNTU) if statusOutput[0] == 0: outputList = QString(statusOutput[1]).split("\n") for value in outputList: if value.split(" ")[0] == "address": ip = value.split(" ")[1] elif value.split(" ")[0] == "netmask": netmask = value.split(" ")[1] elif value.split(" ")[0] == "gateway": gateway = value.split(" ")[1] return [ip, netmask, gateway] def getNetworkType(self): """得到网络是静态还是动态类型""" netType = None DNSType = None statusOutput = commands.getstatusoutput("cat %s" % common.NETWORK_CONFIG_UBUNTU) if statusOutput[0] == 0: output = QString(statusOutput[1]) if output.contains("dhcp"): netType = "dhcp" else: netType = "static" if output.contains("dns-nameservers"): DNSType = "customDNS" else: DNSType = "AUTODNS" return [netType, DNSType] def checkInputValid(self): """检测输入的有效性""" if self.checkStaticIPInputValid() and self.checkDnsInputValid(): return True return False def checkStaticIPInputValid(self): """检查静态IP输入内容的有效性""" ip = self.ip.text().trimmed() netmask = self.netmast.text().trimmed() gateway = self.defaultGateway.text().trimmed() if not self.autoGetIpCheckbox.isChecked(): if ip.isEmpty() or ip.isNull() or netmask.isEmpty() or netmask.isNull(): InfoHintDialog(u'IP地址或子网掩码不能为空').exec_() return False pattern = '^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$' matchObj = re.match(pattern, ip) if matchObj is None: InfoHintDialog(u'IP地址格式有误,请重新填入').exec_() self.ip.setFocus() return False matchObj = re.match(pattern, str(netmask)) if matchObj is None: InfoHintDialog(u'子网掩码地址格式有误,请重新填入').exec_() self.netmast.setFocus() return False if gateway: matchObj = re.match(pattern, str(gateway)) if matchObj is None: InfoHintDialog(u'网关地址格式有误,请重新填入').exec_() self.netmast.setFocus() return False return True def checkDnsInputValid(self): """检查DNS输入的内容的有效性""" if not self.autoGetDNSCheckBox.isChecked(): dns = self.dns.text().trimmed() backupDns = self.backupDns.text().trimmed() if dns.isEmpty() or dns.isNull(): InfoHintDialog(u'DNS不能为空').exec_() return False pattern = '^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$' matchObj = re.match(pattern, str(dns)) if matchObj is None: InfoHintDialog(u'DNS地址格式有误,请重新填入').exec_() self.dns.setFocus() return False if backupDns: matchObj = re.match(pattern, str(backupDns)) if matchObj is None: InfoHintDialog(u'备用DNS地址格式有误,请重新填入').exec_() self.backupDns.setFocus() return False return True else: return True def slotSettingDNSType(self, status): if status == Qt.Checked: self.dnsServerAddressGroupbox.setChecked(False) elif status == Qt.Unchecked: self.dnsServerAddressGroupbox.setChecked(True) def slotSettingCustomDNSType(self, status): if status: self.autoGetDNSCheckBox.setChecked(False) else: self.autoGetDNSCheckBox.setChecked(True) def slotSettingDHCPType(self, status): if status == Qt.Checked: self.staticIpGroupbox.setChecked(False) self.dnsServerAddressGroupbox.setChecked(False) self.autoGetDNSCheckBox.setChecked(True) self.autoGetDNSCheckBox.setEnabled(False) self.dnsServerAddressGroupbox.setEnabled(False) elif status == Qt.Unchecked: self.staticIpGroupbox.setChecked(True) self.dnsServerAddressGroupbox.setChecked(True) self.autoGetDNSCheckBox.setEnabled(True) self.autoGetDNSCheckBox.setChecked(False) self.dnsServerAddressGroupbox.setEnabled(True) def slotSettingStaticType(self, status): if status: self.autoGetIpCheckbox.setChecked(False) self.dnsServerAddressGroupbox.setChecked(True) self.autoGetDNSCheckBox.setEnabled(True) self.autoGetDNSCheckBox.setChecked(False) self.dnsServerAddressGroupbox.setEnabled(True) else: self.autoGetIpCheckbox.setChecked(True) self.dnsServerAddressGroupbox.setChecked(False) self.autoGetDNSCheckBox.setEnabled(False) self.autoGetDNSCheckBox.setChecked(True) self.dnsServerAddressGroupbox.setEnabled(False) def setDynamicNetwork(self): """设置动态网络的信息到配置文件""" netconf="conf=0&ip=&mask=&gateway=" #如果是指定DNS地址 if self.dnsServerAddressGroupbox.isChecked(): dns = str(self.dns.text().trimmed()) backupDns = str(self.backupDns.text().trimmed()) if not backupDns: netconf = netconf + "&dns1=" + dns else: netconf = netconf + "&dns1=" + dns + "&dns2=" + backupDns StoreInfoParser.instance().setDNSStatus("static") else: netconf = netconf + "&dns1=&dns2=" StoreInfoParser.instance().setDNSStatus("dhcp") return netconf def setStaticNetwork(self): """设置静态网络的信息到配置文件""" IPADDR = str(self.ip.text().trimmed()) NETMASK = str(self.netmast.text().trimmed()) GATEWAY = str(self.defaultGateway.text().trimmed()) content = None if not GATEWAY: content = "conf=1&ip=%s&mask=%s&gateway=" % (IPADDR, NETMASK) else: content = "conf=1&ip=%s&mask=%s&gateway=%s" % (IPADDR, NETMASK, GATEWAY) #如果是指定DNS地址 if self.dnsServerAddressGroupbox.isChecked(): dns = str(self.dns.text().trimmed()) backupDns = str(self.backupDns.text().trimmed()) if not backupDns: content = content + "&dns1=" + dns else: content = content + "&dns1=" + dns + "&dns2=" + backupDns StoreInfoParser.instance().setDNSStatus("static") else: content = content + "&dns1=&dns2=" StoreInfoParser.instance().setDNSStatus("dhcp") return content
class EthernetEditor(QFrame): def __init__(self, ethernet, parent=None): QFrame.__init__(self, parent) self.ethernet = ethernet self.buildGUI() self.fillValues() def buildGUI(self): #general setup form = QFormLayout(self) self.label = OptionnalLine(hint="Optional interface name") form.addRow(self.tr("Interface name"), self.label) self.speed_group = QButtonGroup() self.speed_box = QGroupBox(tr("Force an ethernet speed")) speed_layout = QVBoxLayout(self.speed_box) self.speed_GFull = QRadioButton(tr("Gigabit full duplex")) self.speed_GHalf = QRadioButton(tr("Gigabit half duplex")) self.speed_100Full = QRadioButton(tr("100 Mb Full duplex")) self.speed_100Half = QRadioButton(tr("100 Mb Half duplex")) self.speed_10Full = QRadioButton(tr("10 Mb Full duplex")) self.speed_10Half = QRadioButton(tr("10 Mb Half duplex")) def toggle(value): if value: self.speed_GFull.click() self.speed_box.setCheckable(True) self.speed_box.setChecked(Qt.Unchecked) self.connect(self.speed_box, SIGNAL('toggled(bool)'), toggle) for item in ( self.speed_GFull, self.speed_GHalf, self.speed_100Full, self.speed_100Half, self.speed_10Full, self.speed_10Half, ): self.speed_group.addButton(item) speed_layout.addWidget(item) form.addRow(self.speed_box) def fillValues(self): name = self.ethernet.user_label if name != "": self.label.setText(name) self.label.checkEmpty() self.label.setStyleSheet('') if self.ethernet.eth_auto: self.speed_box.setChecked(Qt.Unchecked) return self.speed_box.setChecked(Qt.Checked) if self.ethernet.eth_duplex == Ethernet.FULL: if self.ethernet.eth_speed == 10: button = self.speed_10Full elif self.ethernet.eth_speed == 100: button = self.speed_100Full else: button = self.speed_GFull else: if self.ethernet.eth_speed == 10: button = self.speed_10Half elif self.ethernet.eth_speed == 100: button = self.speed_100Half else: button = self.speed_GHalf button.setChecked(Qt.Checked) def getConfig(self): auto = not self.speed_box.isChecked() if auto: return True, None, None selection = self.speed_group.checkedButton() if selection is self.speed_GFull: return False, 1000, Ethernet.FULL elif self.speed_GHalf: return False, 1000, Ethernet.HALF elif self.speed_100Full: return False, 100, Ethernet.FULL elif self.speed_100Half: return False, 100, Ethernet.HALF elif self.speed_10Full: return False, 10, Ethernet.FULL elif self.speed_10Half: return False, 10, Ethernet.HALF assert False, "this selection is unknown" def setName(self): new_name = self.label.value() if new_name != self.ethernet.user_label: self.ethernet.user_label = new_name #message = tr("renamed ethernet interface to: %s'") % new_name return True def accept(self, *args, **kwargs): ok = True ok &= self.setName() self.ethernet.setEthernetMode(*self.getConfig()) if ok: self.emit(SIGNAL('edited'), "edited ethernet interface '%s'" \ % self.ethernet.fullName()) return ok
class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " ec = ExplorerContainer() super(Main, self).initialize(*args, **kwargs) self.editor_s = self.locator.get_service('editor') # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.group0 = QGroupBox() self.group0.setTitle(' Source ') self.source = QComboBox() self.source.addItems(['Clipboard', 'Local File', 'Remote URL', 'Ninja']) self.source.currentIndexChanged.connect(self.on_source_changed) self.infile = QLineEdit(path.expanduser("~")) self.infile.setPlaceholderText(' /full/path/to/file.html ') self.infile.setCompleter(self.completer) self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.setCursor(QCursor(Qt.PointingHandCursor)) self.open.clicked.connect(lambda: self.infile.setText(str( QFileDialog.getOpenFileName(self.dock, "Open a File to read from", path.expanduser("~"), ';;'.join(['{}(*.{})'.format(e.upper(), e) for e in ['css', 'html', 'js', 'txt', '*']]))))) self.inurl = QLineEdit('http://www.') self.inurl.setPlaceholderText('http://www.full/url/to/remote/file.html') self.output = QPlainTextEdit(SAMPLE_TEXT) vboxg0 = QVBoxLayout(self.group0) for each_widget in (self.source, self.infile, self.open, self.inurl, self.output, ): vboxg0.addWidget(each_widget) [a.hide() for a in iter((self.infile, self.open, self.inurl))] self.group1 = QGroupBox() self.group1.setTitle(' CSS3 ') self.group1.setCheckable(True) self.group1.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group1.graphicsEffect().setEnabled(False) self.group1.toggled.connect(self.toggle_css_group) self.ckcss1 = QCheckBox('Remove unnecessary Comments') self.ckcss2 = QCheckBox('Remove unnecessary Whitespace characters') self.ckcss3 = QCheckBox('Remove unnecessary Semicolons') self.ckcss4 = QCheckBox('Remove unnecessary Empty rules') self.ckcss5 = QCheckBox('Condense and Convert Colors from RGB to HEX') self.ckcss6 = QCheckBox('Condense all Zero units') self.ckcss7 = QCheckBox('Condense Multidimensional Zero units') self.ckcss8 = QCheckBox('Condense Floating point numbers') self.ckcss9 = QCheckBox('Condense HEX Colors') self.ckcss10 = QCheckBox('Condense multiple adjacent Whitespace chars') self.ckcss11 = QCheckBox('Condense multiple adjacent semicolon chars') self.ckcss12 = QCheckBox('Wrap the lines of the to 80 character length') self.ckcss13 = QCheckBox('Condense Font Weight values') self.ckcss14 = QCheckBox('Condense the 17 Standard Named Colors values') self.ckcss15 = QCheckBox('Condense the 124 Extra Named Colors values') self.ckcss16 = QCheckBox('Condense all Percentages values when posible') self.ckcss17 = QCheckBox('Condense all Pixels values when posible') self.ckcss18 = QCheckBox('Remove unnecessary quotes from url()') self.ckcss19 = QCheckBox('Add standard Encoding Declaration if missing') vboxg1 = QVBoxLayout(self.group1) for each_widget in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, self.ckcss16, self.ckcss17, self.ckcss18, self.ckcss19): vboxg1.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group2 = QGroupBox() self.group2.setTitle(' HTML5 ') self.group2.setCheckable(True) self.group2.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group2.graphicsEffect().setEnabled(False) self.group2.toggled.connect(self.toggle_html_group) self.ckhtml0 = QCheckBox('Condense Style and Script HTML Tags') self.ckhtml1 = QCheckBox('Condense DOCTYPE to new HTML5 Tags') self.ckhtml2 = QCheckBox('Condense Href and Src to protocol agnostic') self.ckhtml4 = QCheckBox('Remove unnecessary Tags but keep HTML valid') self.help1 = QLabel('''<a href= "https://developers.google.com/speed/articles/optimizing-html"> <small><center>Help about Unneeded Unnecessary HTML tags ?</a>''') self.help1.setTextInteractionFlags(Qt.LinksAccessibleByMouse) self.help1.setOpenExternalLinks(True) vboxg2 = QVBoxLayout(self.group2) for each_widget in (self.ckhtml0, self.ckhtml1, self.ckhtml2, self.ckhtml4, self.help1, ): vboxg2.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group3 = QGroupBox() self.group3.setTitle(' Javascript ') self.ckjs0 = QCheckBox('Condense and Compress Javascript') self.ckjs1 = QCheckBox('Condense $(document).ready(function(){ });') vboxg2 = QVBoxLayout(self.group3) for each_widget in (self.ckjs0, self.ckjs1): vboxg2.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group4 = QGroupBox() self.group4.setTitle(' General ') self.chckbx1 = QCheckBox('Lower case ALL the text') self.chckbx2 = QCheckBox('Remove Spaces, Tabs, New Lines, Empty Lines') self.befor, self.after = QProgressBar(), QProgressBar() self.befor.setFormat("%v Chars") self.after.setFormat("%v Chars") vboxg4 = QVBoxLayout(self.group4) for each_widget in (self.chckbx1, self.chckbx2, QLabel('<b>Before:'), self.befor, QLabel('<b>After:'), self.after): vboxg4.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) [a.setChecked(True) for a in iter((self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, self.ckcss16, self.ckcss17, self.ckcss18, self.ckcss19, self.ckjs1, self.ckhtml0, self.ckhtml1, self.ckhtml2, self.ckhtml4, self.chckbx1, self.chckbx2))] self.button = QPushButton(QIcon.fromTheme("face-cool"), 'Process Text') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) def must_glow(widget_list): ' apply an glow effect to the widget ' for glow, each_widget in enumerate(widget_list): try: if each_widget.graphicsEffect() is None: glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) each_widget.setGraphicsEffect(glow) glow.setEnabled(True) except: pass must_glow((self.button, )) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((QLabel('<b>HTML5/CSS3/JS Optimizer Compressor'), self.group0, self.group1, self.group2, self.group3, self.group4, self.button, )) self.scrollable = QScrollArea() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock = QDockWidget() self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setMinimumWidth(350) self.dock.setWidget(self.scrollable) ec.addTab(self.dock, "Web") QPushButton(QIcon.fromTheme("help-about"), 'About', self.dock ).clicked.connect(lambda: QMessageBox.information(self.dock, __doc__, HELPMSG)) def run(self): ' run the string replacing ' if self.source.currentText() == 'Local File': with open(path.abspath(str(self.infile.text()).strip()), 'r') as f: txt = f.read() elif self.source.currentText() == 'Remote URL': txt = urlopen(str(self.inurl.text()).strip()).read() elif self.source.currentText() == 'Clipboard': txt = str(self.output.toPlainText()) if str(self.output.toPlainText()) is not '' else str(QApplication.clipboard().text()) else: txt = self.editor_s.get_text() self.output.clear() self.befor.setMaximum(len(txt) + 10) self.after.setMaximum(len(txt) + 10) self.befor.setValue(len(txt)) txt = txt.lower() if self.chckbx1.isChecked() is True else txt txt = condense_style(txt) if self.ckhtml0.isChecked() is True else txt txt = condense_script(txt) if self.ckhtml0.isChecked() is True else txt txt = condense_doctype(txt) if self.ckhtml1.isChecked() is True else txt txt = condense_href_src(txt) if self.ckhtml2 is True else txt txt = clean_unneeded_tags(txt) if self.ckhtml4.isChecked() is True else txt txt = condense_doc_ready(txt) if self.ckjs1.isChecked() is True else txt txt = jsmin(txt) if self.ckjs0.isChecked() is True else txt txt = remove_comments(txt) if self.ckcss1.isChecked() is True else txt txt = condense_whitespace(txt) if self.ckcss10.isChecked() is True else txt txt = remove_empty_rules(txt) if self.ckcss4.isChecked() is True else txt txt = remove_unnecessary_whitespace(txt) if self.ckcss2.isChecked() is True else txt txt = remove_unnecessary_semicolons(txt) if self.ckcss3.isChecked() is True else txt txt = condense_zero_units(txt) if self.ckcss6.isChecked() is True else txt txt = condense_multidimensional_zeros(txt) if self.ckcss7.isChecked() is True else txt txt = condense_floating_points(txt) if self.ckcss8.isChecked() is True else txt txt = normalize_rgb_colors_to_hex(txt) if self.ckcss5.isChecked() is True else txt txt = condense_hex_colors(txt) if self.ckcss9.isChecked() is True else txt txt = wrap_css_lines(txt, 80) if self.ckcss12.isChecked() is True else txt txt = condense_semicolons(txt) if self.ckcss11.isChecked() is True else txt txt = condense_font_weight(txt) if self.ckcss13.isChecked() is True else txt txt = condense_std_named_colors(txt) if self.ckcss14.isChecked() is True else txt # txt = condense_xtra_named_colors(txt) if self.ckcss14.isChecked() is True else txt # FIXME txt = condense_percentage_values(txt) if self.ckcss16.isChecked() is True else txt txt = condense_pixel_values(txt) if self.ckcss17.isChecked() is True else txt txt = remove_url_quotes(txt) if self.ckcss18.isChecked() is True else txt txt = add_encoding(txt) if self.ckcss19.isChecked() is True else txt txt = " ".join(txt.strip().split()) if self.chckbx2.isChecked() is True else txt self.after.setValue(len(txt)) self.output.setPlainText(txt) self.output.show() self.output.setFocus() self.output.selectAll() def on_source_changed(self): ' do something when the desired source has changed ' if self.source.currentText() == 'Local File': self.open.show() self.infile.show() self.inurl.hide() self.output.hide() elif self.source.currentText() == 'Remote URL': self.inurl.show() self.open.hide() self.infile.hide() self.output.hide() elif self.source.currentText() == 'Clipboard': self.output.show() self.open.hide() self.infile.hide() self.inurl.hide() self.output.setText(QApplication.clipboard().text()) else: self.output.show() self.open.hide() self.infile.hide() self.inurl.hide() self.output.setText(self.editor_s.get_text()) def toggle_css_group(self): ' toggle on or off the css checkboxes ' if self.group1.isChecked() is True: [a.setChecked(True) for a in iter((self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, self.ckcss16, self.ckcss17, self.ckcss18, self.ckcss19))] self.group1.graphicsEffect().setEnabled(False) else: [a.setChecked(False) for a in iter((self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, self.ckcss16, self.ckcss17, self.ckcss18, self.ckcss19))] self.group1.graphicsEffect().setEnabled(True) def toggle_html_group(self): ' toggle on or off the css checkboxes ' if self.group2.isChecked() is True: [a.setChecked(True) for a in iter((self.ckhtml0, self.ckhtml1, self.ckhtml2, self.ckhtml4))] self.group2.graphicsEffect().setEnabled(False) else: [a.setChecked(False) for a in iter((self.ckhtml0, self.ckhtml1, self.ckhtml2, self.ckhtml4))] self.group2.graphicsEffect().setEnabled(True)
class NetWorkSettingWidget(QWidget): def __init__(self, app, parent = None): super(NetWorkSettingWidget,self).__init__(parent) self.setStyleSheet("font-size : 16px;") self.app = app self.setNetworkCardFilePath() self.initLayout() self.initCheckBoxStatus() self.restartNetworkTD = RestartNetworkThread() self.waitingDlg = InfoHintDialog(None) #绑定信号 self.connect(self.autoGetIpCheckbox, SIGNAL("stateChanged(int)"),self.slotSettingDHCPType) self.connect(self.staticIpGroupbox, SIGNAL("clicked(bool)"),self.slotSettingStaticType) self.connect(self.autoGetDNSCheckBox, SIGNAL("stateChanged(int)"),self.slotSettingDNSType) self.connect(self.dnsServerAddressGroupbox, SIGNAL("clicked(bool)"),self.slotSettingCustomDNSType) self.connect(self.saveBtn, SIGNAL("clicked()"),self.slotSave) self.connect(self.restartNetworkTD, SIGNAL("restartNetwork"),self.slotShowRestartNetworkInfo) def setNetworkCardFilePath(self): #self.networkconfigFile = common.NETWORK_CONFIG_CENTOS_7_0 + "br0" #self.bridgeNetworkconfigFile = common.NETWORK_CONFIG_CENTOS_7_0 + "br0" ethName = common.DEFAULT_NETCARD_NAME ethNameList = globalfunc.getEthNameList() if not ethNameList: LogRecord.instance().logger.info(u"获取网卡名称失败!") else: ethName = ethNameList[0] self.originalNetConfigFile = common.NETWORK_CONFIG_CENTOS_7_0 + ethName LogRecord.instance().logger.info(u"获取网卡名称:%s" % self.originalNetConfigFile) self.originalBridgerNetConfigFile = common.BRIDGER_NETWORK_CONFIG_CENTOS_7_0 LogRecord.instance().logger.info(u"获取bridge网卡名称:%s" % self.originalNetConfigFile) self.networkconfigFile = self.originalNetConfigFile self.bridgeNetworkconfigFile = self.originalBridgerNetConfigFile if globalvariable.PROGRAM_RUNNING_TYPE == common.OPERATION_ENV_TYPE:#running env self.networkconfigFile = globalfunc.convertPathToConfigPath(self.originalNetConfigFile) self.bridgeNetworkconfigFile = globalfunc.convertPathToConfigPath(self.originalBridgerNetConfigFile) #self.networkconfigFile = common.NETWORK_CONFIG_CENTOS_7_0 + "br0" def initLayout(self): #IP设置 self.autoGetIpCheckbox = QCheckBox(self.tr("Auto get IP")) self.staticIpGroupbox = QGroupBox(self.tr("Use this IP")) self.staticIpGroupbox.setCheckable(True) self.ipLabel = QLabel(self.tr("IP address")) self.netmastLabel = QLabel(self.tr("Net mask")) self.defaultGatewayLabel = QLabel(self.tr("Default gateway")) topSpaceWidget = QLabel() topSpaceWidget.setFixedHeight(1) self.ip = QLineEdit() self.ip.setContextMenuPolicy(Qt.NoContextMenu) self.ip.setFixedSize(400, 30) self.netmast = QLineEdit() self.netmast.setContextMenuPolicy(Qt.NoContextMenu) self.defaultGateway = QLineEdit() self.defaultGateway.setContextMenuPolicy(Qt.NoContextMenu) topGridLayout = QGridLayout() topGridLayout.setSpacing(15) topGridLayout.setMargin(20) topGridLayout.addWidget(self.ipLabel, 0, 0, 1, 1) topGridLayout.addWidget(self.ip, 0, 1, 1, 1) topGridLayout.addWidget(self.netmastLabel, 1, 0, 1, 1) topGridLayout.addWidget(self.netmast, 1, 1, 1, 1) topGridLayout.addWidget(self.defaultGatewayLabel, 2, 0, 1, 1) topGridLayout.addWidget(self.defaultGateway, 2, 1, 1, 1) topGridLayout.addWidget(topSpaceWidget, 3, 0, 1, 1) self.staticIpGroupbox.setLayout(topGridLayout) #DNS设置 self.autoGetDNSCheckBox = QCheckBox(self.tr("Auto Get DNS")) self.dnsServerAddressGroupbox = QGroupBox(self.tr("Use This DNS")) self.dnsServerAddressGroupbox.setCheckable(True) self.dnsLabel = QLabel(self.tr("DNS")) self.backupDnsLabel = QLabel(self.tr("Backup DNS")) bottomSpaceWidget = QLabel() bottomSpaceWidget.setFixedHeight(1) self.dns = QLineEdit() self.dns.setContextMenuPolicy(Qt.NoContextMenu) self.backupDns = QLineEdit() self.backupDns.setContextMenuPolicy(Qt.NoContextMenu) self.saveBtn = QPushButton(self.tr("Save")) self.saveBtn.setStyleSheet("background: rgb(7,87,198); color: white; width: 90px; height: 30px;font-size : 16px;") bottomGridLayout = QGridLayout() bottomGridLayout.setSpacing(15) bottomGridLayout.setMargin(20) bottomGridLayout.addWidget(self.dnsLabel, 0, 0, 1, 1) bottomGridLayout.addWidget(self.dns, 0, 1, 1, 1) bottomGridLayout.addWidget(self.backupDnsLabel, 1, 0, 1, 1) bottomGridLayout.addWidget(self.backupDns, 1, 1, 1, 1) bottomGridLayout.addWidget(bottomSpaceWidget, 2, 0, 1, 1) self.dnsServerAddressGroupbox.setLayout(bottomGridLayout) #布局调整 vLayout = QVBoxLayout() vLayout.setSpacing(10) vLayout.setMargin(10) vLayout.addWidget(self.autoGetIpCheckbox) vLayout.addWidget(self.staticIpGroupbox) vLayout.addSpacing(15) vLayout.addWidget(self.autoGetDNSCheckBox) vLayout.addWidget(self.dnsServerAddressGroupbox) vLayout.addStretch() topMainLayout = QHBoxLayout() topMainLayout.addStretch() topMainLayout.addSpacing(50) topMainLayout.addLayout(vLayout) topMainLayout.addStretch(2) bottomHLayout = QHBoxLayout() bottomHLayout.addStretch() bottomHLayout.addWidget(self.saveBtn) bottomHLayout.addStretch() mainVLayout = QVBoxLayout() mainVLayout.addLayout(topMainLayout) mainVLayout.addSpacing(10) mainVLayout.addLayout(bottomHLayout) self.setLayout(mainVLayout) def updateWindow(self): self.autoGetDNSCheckBox.setText(self.tr("Auto Get DNS")) self.autoGetIpCheckbox.setText(self.tr("Auto get IP")) self.dnsServerAddressGroupbox.setTitle(self.tr("Use This DNS")) self.staticIpGroupbox.setTitle(self.tr("Use this IP")) self.ipLabel.setText(self.tr("IP address")) self.netmastLabel.setText(self.tr("Net mask")) self.defaultGatewayLabel.setText(self.tr("Gate way")) self.dnsLabel.setText(self.tr("DNS")) self.backupDnsLabel.setText(self.tr("Backup DNS")) self.saveBtn.setText(self.tr("Save")) def slotShowRestartNetworkInfo(self, status): language = StoreInfoParser.instance().getLanguage() m_pTranslator = QTranslator() exePath = "./" if language == "chinese": QmName = "zh_CN.qm" else: QmName = "en_US.qm" if(m_pTranslator.load(QmName, exePath)): QCoreApplication.instance().installTranslator(m_pTranslator) """显示重启网络的状态信息""" if status == "Start": self.waitingDlg.setHintInfo(self.tr("network is restarting, waiting...")) elif status == "Success": self.waitingDlg.setHintInfo(self.tr("network start success!")) vmtype = StoreInfoParser.instance().getVmType() if vmtype == "offline": pass elif status == "Failed": self.waitingDlg.setHintInfo(self.tr("network restart failed!")) else: return if self.waitingDlg.isHidden(): self.waitingDlg.exec_() def slotSave(self): language = StoreInfoParser.instance().getLanguage() m_pTranslator = QTranslator() exePath = "./" if language == "chinese": QmName = "zh_CN.qm" else: QmName = "en_US.qm" if(m_pTranslator.load(QmName, exePath)): QCoreApplication.instance().installTranslator(m_pTranslator) if not self.checkInputValid(): return if globalvariable.PROGRAM_RUNNING_TYPE == common.OPERATION_ENV_TYPE:#running if not os.path.exists(self.networkconfigFile): os.system("mkdir -p %s" % os.path.dirname(self.networkconfigFile))#create dir os.mknod(self.networkconfigFile)#create empty file os.system("echo \"%s\" >> /config/files" % self.originalNetConfigFile)#mark if not os.path.exists(self.bridgeNetworkconfigFile): os.system("mkdir -p %s" % os.path.dirname(self.bridgeNetworkconfigFile))#create dir os.mknod(self.bridgeNetworkconfigFile)#create empty file os.system("echo \"%s\" >> /config/files" % self.originalBridgerNetConfigFile)#mark if not os.path.isfile(self.originalNetConfigFile): os.system("mkdir -p %s" % os.path.dirname(self.originalNetConfigFile)) os.mknod(self.originalNetConfigFile) if not os.path.isfile(self.originalBridgerNetConfigFile): os.system("mkdir -p %s" % os.path.dirname(self.originalBridgerNetConfigFile)) os.mknod(self.originalBridgerNetConfigFile) else: if not os.path.exists(self.networkconfigFile): os.system("mkdir -p %s" % os.path.dirname(self.networkconfigFile))#create dir os.mknod(self.networkconfigFile)#create empty file #os.system("echo \"%s\" >> /config/files" % self.originalNetConfigFile)#mark if not os.path.exists(self.bridgeNetworkconfigFile): #os.system("mkdir -p %s" % os.path.dirname(self.networkconfigFile))#create dir os.mknod(self.bridgeNetworkconfigFile)#create empty file #os.system("echo \"%s\" >> /config/files" % self.originalNetConfigFile)#mark if not os.path.isfile(self.originalNetConfigFile): os.system("mkdir -p %s" % os.path.dirname(self.originalNetConfigFile)) os.mknod(self.originalNetConfigFile) if not os.path.isfile(self.originalBridgerNetConfigFile): os.system("mkdir -p %s" % os.path.dirname(self.originalBridgerNetConfigFile)) os.mknod(self.originalBridgerNetConfigFile) if globalvariable.PROGRAM_RUNNING_TYPE == common.OPERATION_ENV_TYPE:#running globalfunc.umountFile(self.originalNetConfigFile) globalfunc.umountFile(self.originalBridgerNetConfigFile) if self.autoGetIpCheckbox.isChecked(): if not self.setDynamicNetwork(): if globalvariable.PROGRAM_RUNNING_TYPE == common.OPERATION_ENV_TYPE: globalfunc.mountFile(self.originalNetConfigFile) globalfunc.mountFile(self.originalBridgerNetConfigFile) return elif self.staticIpGroupbox.isChecked(): if not self.setStaticNetwork(): if globalvariable.PROGRAM_RUNNING_TYPE == common.OPERATION_ENV_TYPE: globalfunc.mountFile(self.originalNetConfigFile) globalfunc.mountFile(self.originalBridgerNetConfigFile) return if globalvariable.PROGRAM_RUNNING_TYPE == common.OPERATION_ENV_TYPE: globalfunc.mountFile(self.originalNetConfigFile) globalfunc.mountFile(self.originalBridgerNetConfigFile) #重新启动网络 self.restartNetworkTD.start() return def initCheckBoxStatus(self): """读取网络配置文件,初始化相应的checkbox的状态""" [netType, DNSType] = self.getNetworkType() if netType == "dhcp": self.autoGetIpCheckbox.setChecked(True) self.staticIpGroupbox.setChecked(False) else: self.autoGetIpCheckbox.setChecked(False) self.staticIpGroupbox.setChecked(True) [ip, netmask, gateway] = self.getStaticNetworkInfo() if ip: self.ip.setText(ip) if netmask: self.netmast.setText(netmask) if gateway: self.defaultGateway.setText(gateway) if DNSType == "AUTODNS": self.autoGetDNSCheckBox.setChecked(True) self.dnsServerAddressGroupbox.setChecked(False) else: self.autoGetDNSCheckBox.setChecked(False) self.dnsServerAddressGroupbox.setChecked(True) [DNS_first, DNS_second] = self.getCustomDNSInfo() if DNS_first: self.dns.setText(DNS_first) if DNS_second: self.backupDns.setText(DNS_second) def getCustomDNSInfo(self): """得到自定义DNS的内容""" DNS_first = None DNS_second = None statusOutput = commands.getstatusoutput("cat %s" % self.bridgeNetworkconfigFile) if statusOutput[0] == 0: outputList = QString(statusOutput[1]).split("\n") for value in outputList: if value.split("=")[0] == "DNS1": DNS_first = value.split("=")[1] elif value.split("=")[0] == "DNS2": DNS_second = value.split("=")[1] return [DNS_first, DNS_second] def getStaticNetworkInfo(self): """得到静态网络的信息""" ip = netmask = gateway = None statusOutput = commands.getstatusoutput("cat %s" % self.bridgeNetworkconfigFile) if statusOutput[0] == 0: outputList = QString(statusOutput[1]).split("\n") for value in outputList: if value.split("=")[0] == "IPADDR": ip = value.split("=")[1] elif value.split("=")[0] == "NETMASK": netmask = value.split("=")[1] elif value.split("=")[0] == "GATEWAY": gateway = value.split("=")[1] return [ip, netmask, gateway] def getNetworkType(self): """得到网络是静态还是动态类型""" netType = None DNSType = None statusOutput = commands.getstatusoutput("cat %s" % self.bridgeNetworkconfigFile) if statusOutput[0] == 0: output = QString(statusOutput[1]) if output.contains("dhcp"): netType = "dhcp" else: netType = "static" if output.contains("DNS"): DNSType = "customDNS" else: DNSType = "AUTODNS" return [netType, DNSType] def checkInputValid(self): """检测输入的有效性""" if self.checkStaticIPInputValid() and self.checkDnsInputValid(): return True return False def checkStaticIPInputValid(self): """检查静态IP输入内容的有效性""" ip = self.ip.text().trimmed() netmask = self.netmast.text().trimmed() gateway = self.defaultGateway.text().trimmed() if not self.autoGetIpCheckbox.isChecked(): if ip.isEmpty() or ip.isNull() or netmask.isEmpty() or netmask.isNull(): InfoHintDialog(self.tr("IP address or net mask is empty")).exec_() return False pattern = '^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$' matchObj = re.match(pattern, ip) if matchObj is None: InfoHintDialog(self.tr("IP address is wrong, please input again")).exec_() self.ip.setFocus() return False matchObj = re.match(pattern, str(netmask)) if matchObj is None: InfoHintDialog(self.tr("Net mask is wrong")).exec_() self.netmast.setFocus() return False if gateway: matchObj = re.match(pattern, str(gateway)) if matchObj is None: InfoHintDialog(self.tr("Gate way is wrong")).exec_() self.netmast.setFocus() return False return True def checkDnsInputValid(self): """检查DNS输入的内容的有效性""" if not self.autoGetDNSCheckBox.isChecked(): dns = self.dns.text().trimmed() backupDns = self.backupDns.text().trimmed() if dns.isEmpty() or dns.isNull(): InfoHintDialog(self.tr("DNS is empty")).exec_() return False pattern = '^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$' matchObj = re.match(pattern, str(dns)) if matchObj is None: InfoHintDialog(self.tr("DNS is wrong, please input again")).exec_() self.dns.setFocus() return False if backupDns: matchObj = re.match(pattern, str(backupDns)) if matchObj is None: InfoHintDialog(self.tr("Backup DNS is wrong, please input again")).exec_() self.backupDns.setFocus() return False return True else: return True def slotSettingDNSType(self, status): if status == Qt.Checked: self.dnsServerAddressGroupbox.setChecked(False) elif status == Qt.Unchecked: self.dnsServerAddressGroupbox.setChecked(True) def slotSettingCustomDNSType(self, status): if status: self.autoGetDNSCheckBox.setChecked(False) else: self.autoGetDNSCheckBox.setChecked(True) def slotSettingDHCPType(self, status): if status == Qt.Checked: self.staticIpGroupbox.setChecked(False) elif status == Qt.Unchecked: self.staticIpGroupbox.setChecked(True) def slotSettingStaticType(self, status): if status: self.autoGetIpCheckbox.setChecked(False) else: self.autoGetIpCheckbox.setChecked(True) def setDynamicNetwork(self): """设置动态网络的信息到配置文件""" # delCmd = "sed -i '/BOOTPROTO/,$'d %s" % self.networkconfigFile delCmd = "echo '' > %s" % self.networkconfigFile delBrCmd = "echo '' > %s" % self.bridgeNetworkconfigFile delOk = os.system(delCmd) delOkB = os.system(delBrCmd) #return deviceName = self.networkconfigFile.split("/")[-1].split("-")[-1] macValue = globalfunc.getMacByEthName(deviceName) content = None #eth0 contenteth = "BOOTPROTO=none\\nDEVICE=%s\\nHWADDR=%s\\nNM_CONTROLLED=no\\nONBOOT=yes\\nBRIDGE=br0" % (deviceName, macValue) #如果是指定DNS地址 if self.dnsServerAddressGroupbox.isChecked(): dns = str(self.dns.text().trimmed()) backupDns = str(self.backupDns.text().trimmed()) if not backupDns: content = "BOOTPROTO=dhcp\\nDEVICE=br0\\nNM_CONTROLLED=no\\nONBOOT=yes\\nTYPE=Bridge\\nPEERNTP=yes\\ncheck_link_down(){\\n return 1; \\n}\\nDNS1=%s" % (dns) else: content = "BOOTPROTO=dhcp\\nDEVICE=br0\\NM_CONTROLLED=no\\nONBOOT=yes\\nTYPE=Bridge\\nPEERNTP=yes\\ncheck_link_down(){\\n return 1; \\n}\\nDNS1=%s\\nDNS2=%s" % (dns,backupDns) else: content = "BOOTPROTO=dhcp\\nDEVICE=br0\\nNM_CONTROLLED=no\\nONBOOT=yes\\nTYPE=Bridge\\nPEERNTP=yes\\ncheck_link_down(){\\n return 1; \\n}" addEthCmd = "sed -i '$ a\\%s' %s" % (contenteth, self.networkconfigFile) addCmd = "sed -i '$ a\\%s' %s" % (content, self.bridgeNetworkconfigFile) # addCmd = "echo %s > %s" % (content, self.networkconfigFile) addOk = os.system(addCmd) addE = os.system(addEthCmd) if delOk != 0 or addOk != 0 or delOkB != 0 or addE != 0: InfoHintDialog(self.tr("Auto get IP failed")).exec_() return False return True def setStaticNetwork(self): """设置静态网络的信息到配置文件""" # delCmd = "sed -i '/BOOTPROTO/,$'d %s" % self.networkconfigFile delCmd = "echo \"\" > %s" % self.networkconfigFile delOk = os.system(delCmd) delCmdBr = "echo \"\" > %s" % self.bridgeNetworkconfigFile delOkBr = os.system(delCmdBr) IPADDR = str(self.ip.text().trimmed()) NETMASK = str(self.netmast.text().trimmed()) GATEWAY = str(self.defaultGateway.text().trimmed()) deviceName = self.networkconfigFile.split("/")[-1].split("-")[-1] macValue = globalfunc.getMacByEthName(deviceName) #eth0 contenteth = "BOOTPROTO=none\\nDEVICE=%s\\nHWADDR=%s\\nNM_CONTROLLED=no\\nONBOOT=yes\\nBRIDGE=br0" % (deviceName, macValue) content = None if not GATEWAY: content = "BOOTPROTO=static\\nDEVICE=br0\\nTYPE=Bridge\\nNM_CONTROLLED=no\\nIPADDR=%s\\nNETMASK=%s" % (IPADDR, NETMASK) else: content = "BOOTPROTO=static\\nDEVICE=br0\\nTYPE=Bridge\\nNM_CONTROLLED=no\\nIPADDR=%s\\nNETMASK=%s\\nGATEWAY=%s" % (IPADDR, NETMASK, GATEWAY) #如果是指定DNS地址 if self.dnsServerAddressGroupbox.isChecked(): dns = str(self.dns.text().trimmed()) backupDns = str(self.backupDns.text().trimmed()) if not backupDns: content = "%s\\nDNS1=%s" % (content, dns) else: content = "%s\\nDNS1=%s\\nDNS2=%s" % (content, dns, backupDns) addCmdEth = "sed -i '$ a\\%s' %s" % (contenteth, self.networkconfigFile) addCmdBr = "sed -i '$ a\\%s' %s" % (content, self.bridgeNetworkconfigFile) # addCmd = "echo %s > %s" % (content, self.networkconfigFile) addOk = os.system(addCmdEth) addOkBr = os.system(addCmdBr) if delOk != 0 and addOk != 0 and delOkBr != 0 and addOkBr != 0: InfoHintDialog(self.tr("Setting static IP failed")).exec_() return False return True
class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " ec = ExplorerContainer() super(Main, self).initialize(*args, **kwargs) # directory auto completer self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.RUNS, self.FAILS = 0, 0 self.group0 = QGroupBox() self.group0.setTitle(' Source and Target ') self.baseurl = QLineEdit('http://google.com') self.outfile = QLineEdit(path.join(path.expanduser("~"), 'test.py')) self.outfile.setCompleter(self.completer) self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.clicked.connect(lambda: self.outfile.setText( QFileDialog.getSaveFileName(self.dock, "Save", path.expanduser("~"), 'PYTHON(*.py)'))) vboxg0 = QVBoxLayout(self.group0) for each_widget in (QLabel('<b>Base URL'), self.baseurl, QLabel('<b>Local File Target'), self.outfile, self.open): vboxg0.addWidget(each_widget) self.group1 = QGroupBox() self.group1.setTitle(' Selenium ') self.group1.setCheckable(True) self.group1.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group1.graphicsEffect().setEnabled(False) self.group1.toggled.connect(self.toggle_group) self.ckcss1 = QCheckBox('Test for correct Page Loading behaviour') self.ckcss2 = QCheckBox('Test for Sucessfull Status Code return') self.ckcss3 = QCheckBox('Test for valid Title of the web page') self.ckcss4 = QCheckBox('Test for Cookies Basic functionality') self.ckcss5 = QCheckBox('Test for Back, Forward, Reload behaviour') self.ckcss6 = QCheckBox('Take a Screenshot of page (CSS Debug)') self.ckcss7 = QCheckBox('Test for Search Form Field of the page') self.ckcss8 = QCheckBox('Test for Arbitrary Javascript (User provided)') self.ckcss9 = QCheckBox('Test for iFrame of the web page') self.ckcss10 = QCheckBox('Test for HTML5 Canvas element on the page') self.ckcss11 = QCheckBox('Test for HTML5 SVG element on the page') self.ckcss12 = QCheckBox('Test for HTML5 Audio element on the page') self.ckcss13 = QCheckBox('Test for HTML5 Video element on the page') self.ckcss14 = QCheckBox('Test for File Upload form on the page') self.ckcss15 = QCheckBox('Add ChromeDriver path to sys.path') self.webdriver = QComboBox() self.webdriver.addItems(['firefox', 'chrome', 'zope.testbrowser', 'phantomjs']) self.titletxt = QLineEdit('Google') self.javascript = QLineEdit('console.log("test")') self.authdata, self.formdata = QLineEdit(), QLineEdit() self.authdata.setPlaceholderText("{'username':'******','password':'******'}") self.formdata.setPlaceholderText("{'name': 'Joe', 'age': '25'}") self.iframurl = QLineEdit() self.chrmedrv = QLineEdit('/usr/bin/chromedriver') self.timeout = QSpinBox() self.timeout.setMaximum(99) self.timeout.setMinimum(0) self.timeout.setValue(9) vboxg1 = QVBoxLayout(self.group1) for each_widget in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, QLabel('<b>WebDriver'), self.webdriver, QLabel('''<center><small><i>Firefox is only Driver that dont require additional configuration'''), QLabel('<b>Title Content must contain'), self.titletxt, QLabel('<b>Minified Javascript for Test'), self.javascript, QLabel('<b>Arbitrary Authentication Data for Test'), self.authdata, QLabel('<b>Arbitrary Form Data for Test'), self.formdata, QLabel('<b>iFrame URL for Test'), self.iframurl, QLabel('<b>Chrome Driver'), self.chrmedrv, QLabel('<b>Timeout Timer Limit'), self.timeout): vboxg1.addWidget(each_widget) try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) self.group4 = QGroupBox() self.group4.setTitle(' General ') self.chckbx1 = QCheckBox('Run the Tests after Writing') self.chckbx2 = QCheckBox('Open the Tests with Ninja after Writing') self.chckbx3 = QCheckBox('Add SheBang, Encoding and Metadata to Tests') self.nice = QSpinBox() self.nice.setMaximum(20) self.nice.setMinimum(0) self.nice.setValue(20) self.help1 = QLabel('''<a href="http://splinter.cobrateam.info/docs/api" ><center><b>API Reference</a>''') self.help1.setTextInteractionFlags(Qt.LinksAccessibleByMouse) self.help1.setOpenExternalLinks(True) vboxg4 = QVBoxLayout(self.group4) for each_widget in (self.chckbx1, self.chckbx2, self.chckbx3, QLabel('Backend CPU priority:'), self.nice, self.help1): vboxg4.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) [a.setChecked(True) for a in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss15, self.chckbx1, self.chckbx2, self.chckbx3)] self.button = QPushButton(QIcon.fromTheme("face-cool"), 'Write and Run Test') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) glow.setEnabled(True) self.output = QPlainTextEdit() self.runs = QLabel('<font color="green"><b>Runs: 0') self.failures = QLabel('<font color="red"><b>Failures: 0') class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((QLabel('<b>Selenium Tests'), self.group0, self.group1, self.group4, QLabel('<b>Log'), self.output, self.runs, self.failures, self.button)) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ec.addTab(self.dock, "Selenium") QPushButton(QIcon.fromTheme("help-about"), 'About', self.dock ).clicked.connect(lambda: QMessageBox.information(self.dock, __doc__, HELPMSG)) QPushButton(QIcon.fromTheme("media-record"), 'Record', self.group1, ).clicked.connect(lambda: QMessageBox.information(self.dock, __doc__, 'Not working. If you know how to make it Record, send me Pull Request')) def run(self): ' run ' self.RUNS = self.RUNS + 1 self.runs.setText('<font color="green"><b>Runs: {}'.format(self.RUNS)) self.output.clear() self.output.append(self.formatInfoMsg('INFO:{}'.format(datetime.now()))) self.button.setDisabled(True) self.output.append(self.formatInfoMsg(' INFO: OK: Parsing Data ')) selenium_test = SELENIUM_TEMPLATE.format( HEADER if self.chckbx3.isChecked() is True else '', self.chrmedrv.text() if self.ckcss15.isChecked() is True else '', self.baseurl.text(), self.authdata.text() if str(self.authdata.text()) is not '' else {}, self.formdata.text() if str(self.formdata.text()) is not '' else {}, self.iframurl.text(), self.javascript.text(), self.titletxt.text(), self.webdriver.currentText(), '# ' if self.ckcss1.isChecked() is not True else '', '# ' if self.ckcss2.isChecked() is not True else '', '# ' if self.ckcss2.isChecked() is not True else '', '# ' if self.ckcss3.isChecked() is not True else '', '# ' if self.ckcss4.isChecked() is not True else '', '# ' if self.ckcss5.isChecked() is not True else '', '# ' if self.ckcss6.isChecked() is not True else '', '# ' if self.ckcss7.isChecked() is not True else '', '# ' if self.ckcss8.isChecked() is not True else '', '# ' if self.ckcss9.isChecked() is not True else '', '# ' if self.ckcss10.isChecked() is not True else '', '# ' if self.ckcss11.isChecked() is not True else '', '# ' if self.ckcss12.isChecked() is not True else '', '# ' if self.ckcss13.isChecked() is not True else '', '# ' if self.ckcss14.isChecked() is not True else '', self.timeout.value() ) with open(path.abspath(self.outfile.text()), 'w') as f: self.output.append(self.formatInfoMsg(' INFO: OK: Writing Tests ')) f.write(selenium_test) if self.chckbx2.isChecked() is True: self.output.append(self.formatInfoMsg(' INFO: OK: Opening Tests ')) try: startfile(str(path.abspath(self.outfile.text()))) except: Popen(["ninja-ide", str(path.abspath(self.outfile.text()))]) if self.chckbx1.isChecked() is True: try: self.output.append(self.formatInfoMsg('INFO: OK: Runing Tests')) Popen(["python", str(path.abspath(self.outfile.text()))]) except: self.output.append(self.formatErrorMsg('INFO:FAIL: Tests Fail')) self.FAILS = self.FAILS + 1 self.failures.setText( '<font color="red"><b>Failures: {}'.format(self.FAILS)) self.output.append(self.formatInfoMsg('INFO:{}'.format(datetime.now()))) self.button.setDisabled(False) self.output.setFocus() self.output.selectAll() def toggle_group(self): ' toggle on or off the css checkboxes ' if self.group1.isChecked() is True: [a.setChecked(True) for a in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss15)] self.group1.graphicsEffect().setEnabled(False) else: [a.setChecked(False) for a in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss15)] self.group1.graphicsEffect().setEnabled(True) def formatErrorMsg(self, msg): """Format error messages in red color""" return self.formatMsg(msg, 'red') def formatInfoMsg(self, msg): """Format informative messages in blue color""" return self.formatMsg(msg, 'green') def formatMsg(self, msg, color): """Format message with the given color""" return '<font color="{}">{}</font>'.format(color, msg)
class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) self.process = QProcess() self.process.readyReadStandardOutput.connect(self.readOutput) self.process.readyReadStandardError.connect(self.readErrors) self.process.finished.connect(self._process_finished) self.process.error.connect(self._process_finished) self.editor_s = self.locator.get_service('editor') self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.group0 = QGroupBox() self.group0.setTitle(' Source ') self.infile = QLineEdit(path.expanduser("~")) self.infile.setPlaceholderText(' /full/path/to/file.html ') self.infile.setCompleter(self.completer) self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.setCursor(QCursor(Qt.PointingHandCursor)) self.open.clicked.connect(lambda: self.infile.setText(str( QFileDialog.getOpenFileName(self.dock, "Open a File to read from", path.expanduser("~"), ';;'.join(['{}(*.{})'.format(e.upper(), e) for e in ['py', 'pyw', 'txt', '*']]))))) self.output = QTextEdit() vboxg0 = QVBoxLayout(self.group0) for each_widget in (self.infile, self.open, self.output): vboxg0.addWidget(each_widget) self.group1 = QGroupBox() self.group1.setTitle(' General ') self.group1.setCheckable(True) self.group1.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group1.graphicsEffect().setEnabled(False) self.group1.toggled.connect(self.toggle_gral_group) self.ckgrl1 = QCheckBox('Create standalone executable') self.ckgrl2 = QCheckBox('Use Python debug') self.ckgrl3 = QCheckBox('Force compilation for MS Windows') self.ckgrl4 = QCheckBox('When compiling, disable the console window') self.ckgrl5 = QCheckBox('Use link time optimizations if available') self.ckgrl6 = QCheckBox('Force the use of clang') self.ckgrl7 = QCheckBox('Allow minor devitations from Python behaviour') self.ckgrl8 = QCheckBox('Warnings implicit exceptions at compile time') self.pyver, self.jobs = QComboBox(), QSpinBox() self.pyver.addItems(['2.7', '2.6', '3.2', '3.3']) self.jobs.setValue(1) self.jobs.setMaximum(12) self.jobs.setMinimum(1) vboxg1 = QVBoxLayout(self.group1) for each_widget in (self.ckgrl1, self.ckgrl2, self.ckgrl3, self.ckgrl4, self.ckgrl5, self.ckgrl6, self.ckgrl7, self.ckgrl8, QLabel('Python Version to Target'), self.pyver, QLabel('Multi-Processing Parallel Workers'), self.jobs): vboxg1.addWidget(each_widget) try: each_widget.setToolTip(each_widget.text()) except: pass self.group2 = QGroupBox() self.group2.setTitle(' Recursion Control ') self.ckrec0 = QCheckBox('Descend to imported modules from standard lib') self.ckrec1 = QCheckBox('Force not descend to any imported modules') self.ckrec2 = QCheckBox('Try to descend into all imported modules') vboxg2 = QVBoxLayout(self.group2) for each_widget in (self.ckrec0, self.ckrec1, self.ckrec2): vboxg2.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group3 = QGroupBox() self.group3.setTitle(' Execution after compilation ') self.ckexe0 = QCheckBox('Execute created binary (or import the module)') self.ckexe1 = QCheckBox('When executing binary dont reset PYTHONPATH') vboxg2 = QVBoxLayout(self.group3) for each_widget in (self.ckexe0, self.ckexe1): vboxg2.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group4, self.dumptree = QGroupBox(), QTextEdit() self.group4.setTitle(' Dump of internal tree ') QVBoxLayout(self.group4).addWidget(self.dumptree) self.group5 = QGroupBox() self.group5.setTitle(' Code generation ') self.chdmp1 = QCheckBox('Statements shall have their line numbers set') self.chdmp2 = QCheckBox('Disable all unnecessary Python optimization') vboxg5 = QVBoxLayout(self.group5) for each_widget in (self.chdmp1, self.chdmp2): vboxg5.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group6 = QGroupBox() self.group6.setTitle(' Output ') self.outdir = QLineEdit(path.expanduser("~")) self.outdir.setPlaceholderText(' /full/path/to/target/directory ') self.outdir.setCompleter(self.completer) self.open2 = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open2.setCursor(QCursor(Qt.PointingHandCursor)) self.open2.clicked.connect(lambda: self.outdir.setText(str( QFileDialog.getExistingDirectory(self.dock, "Open Target Folder", path.expanduser("~"))))) self.ckcgn2 = QCheckBox('Remove build dir after compile module or exe') vboxg6 = QVBoxLayout(self.group6) for each_widget in (QLabel('Target Output Directory'), self.outdir, self.open2, self.ckcgn2): vboxg6.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group7 = QGroupBox() self.group7.setTitle(' Debug ') self.ckdbg1 = QCheckBox('Execute self checks to find errors in Nuitka') self.ckdbg2 = QCheckBox('Keep debug info in resulting file') self.ckdbg3 = QCheckBox('Traced execution output') self.ckdbg4 = QCheckBox('Allow compile edited C++ file, debug changes') self.ckdbg5 = QCheckBox('Use experimental features') vboxg7 = QVBoxLayout(self.group7) for each_widget in (self.ckdbg1, self.ckdbg2, self.ckdbg3, self.ckdbg4, self.ckdbg5): vboxg7.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group8 = QGroupBox() self.group8.setTitle(' Tracing ') self.cktrc1 = QCheckBox('Show Scons in non-quiet mode, showing command') self.cktrc2 = QCheckBox('Show Progress information and statistics') self.cktrc3 = QCheckBox('Show Verbose output details') vboxg8 = QVBoxLayout(self.group8) for each_widget in (self.cktrc1, self.cktrc2, self.cktrc3): vboxg8.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group9 = QGroupBox() self.group9.setTitle(' Extras ') self.group9.setCheckable(True) self.group9.toggled.connect(self.group9.hide) self.nice = QSpinBox() self.nice.setValue(20) self.nice.setMaximum(20) self.nice.setMinimum(0) self.ckxtr1 = QCheckBox('Open Target Directory later') self.ckxtr2 = QCheckBox('Save a LOG file to target later') self.ckxtr3 = QCheckBox('Save SH Bash script to reproduce Nuitka build') try: self.vinfo = QLabel('<center> <b> Nuitka Backend Version: </b>' + getoutput('nuitka --version',).strip()) except: self.vinfo = QLabel('<b>Warning: Failed to query Nuitka Backend!') vboxg9 = QVBoxLayout(self.group9) for each_widget in (QLabel('Backend CPU Priority'), self.nice, self.ckxtr1, self.ckxtr2, self.ckxtr3, self.vinfo): vboxg9.addWidget(each_widget) self.group10 = QGroupBox() self.group10.setTitle(' Documentation ') self.group10.setCheckable(True) self.group10.toggled.connect(self.group10.hide) vboxg10 = QVBoxLayout(self.group10) for each_widget in (QLabel('''<a href= "file:///usr/share/doc/nuitka/README.pdf.gz"> <small><center> Nuitka User Documentation Local PDF </a>'''), QLabel('''<a href= "file:///usr/share/doc/nuitka/Developer_Manual.pdf.gz"> <small><center> Nuitka Developer Documentation Local PDF </a>'''), QLabel('''<a href="http://nuitka.net/doc/user-manual.html"> <small><center> Nuitka User Documentation On Line HTML </a>'''), QLabel('''<a href="http://nuitka.net/doc/developer-manual.html"> <small><center> Nuitka Developer Documentation On Line HTML </a>''') ): vboxg10.addWidget(each_widget) each_widget.setOpenExternalLinks(True) each_widget.setTextInteractionFlags(Qt.LinksAccessibleByMouse) [a.setChecked(True) for a in (self.ckgrl1, self.ckgrl2, self.ckgrl4, self.ckgrl5, self.ckgrl6, self.ckgrl7, self.ckgrl8, self.ckrec0, self.ckrec1, self.ckrec2, self.ckexe1, self.ckcgn2, self.ckdbg1, self.ckdbg3, self.ckdbg4, self.ckdbg5, self.cktrc1, self.cktrc2, self.cktrc3, self.ckxtr1, self.ckxtr2, self.ckxtr3,)] self.button = QPushButton(QIcon.fromTheme("face-cool"), 'Compile Python') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget(( QLabel('<b>Python Code to Binary Executable Compiler'), self.group0, self.group6, self.group1, self.group2, self.group3, self.group4, self.group5, self.group7, self.group8, self.group9, self.group10, self.button, )) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ExplorerContainer().addTab(self.dock, "Nuitka") QPushButton(QIcon.fromTheme("help-about"), 'About', self.dock ).clicked.connect(lambda: QMessageBox.information(self.dock, __doc__, HELPMSG)) def run(self): ' run the compile ' target = path.abspath(str(self.infile.text()).strip()) self.button.setDisabled(True) self.output.clear() self.output.show() self.output.setFocus() self.output.append(self.formatInfoMsg('INFO:{}'.format(datetime.now()))) self.output.append(self.formatInfoMsg(' INFO: Dumping Internal Tree')) try: self.dumptree.setPlainText( getoutput('nuitka --dump-tree {}'.format(target))) self.dumptree.setMinimumSize(100, 500) except: self.output.append(self.formatErrorMsg('ERROR:FAIL: Internal Tree')) self.output.append(self.formatInfoMsg(' INFO: OK: Parsing Arguments')) cmd = ' '.join(('nice --adjustment={} nuitka'.format(self.nice.value()), # output '--remove-output' if self.ckcgn2.isChecked() is True else '', # general '--exe' if self.ckgrl1.isChecked() is True else '', '--python-debug' if self.ckgrl2.isChecked() is True else '', '--verbose' if self.cktrc3.isChecked() is True else '', '--windows-target' if self.ckgrl3.isChecked() is True else '', '--windows-disable-console' if self.ckgrl4.isChecked() is True else '', '--lto' if self.ckgrl5.isChecked() is True else '', '--clang' if self.ckgrl6.isChecked() is True else '', '--improved' if self.ckgrl7.isChecked() is True else '', '--warn-implicit-exceptions' if self.ckgrl8.isChecked() is True else '', # recursion control '--recurse-stdlib' if self.ckrec0.isChecked() is True else '', '--recurse-none' if self.ckrec1.isChecked() is True else '', '--recurse-all' if self.ckrec2.isChecked() is True else '', # execution after compilation '--execute' if self.ckexe0.isChecked() is True else '', '--keep-pythonpath' if self.ckexe1.isChecked() is True else '', # code generation '--code-gen-no-statement-lines' if self.chdmp1.isChecked() is True else '', '--no-optimization' if self.chdmp2.isChecked() is True else '', # debug '--debug' if self.ckdbg1.isChecked() is True else '', '--unstripped' if self.ckdbg2.isChecked() is True else '', '--trace-execution' if self.ckdbg3.isChecked() is True else '', '--c++-only' if self.ckdbg4.isChecked() is True else '', '--experimental' if self.ckdbg5.isChecked() is True else '', # tracing '--show-scons' if self.cktrc1.isChecked() is True else '', '--show-progress' if self.cktrc2.isChecked() is True else '', '--verbose' if self.cktrc3.isChecked() is True else '', # non boolean parametrization '--python-version={}'.format(self.pyver.currentText()), '--jobs={}'.format(self.jobs.value()), '--output-dir="{}"'.format(self.outdir.text()), target)) self.output.append(self.formatInfoMsg(' INFO: Command: {}'.format(cmd))) self.output.append(self.formatInfoMsg(' INFO: OK: Starting to Compile')) self.process.start(cmd) if not self.process.waitForStarted(): self.output.append(self.formatErrorMsg('ERROR: FAIL: Compile Fail')) self.output.append(self.formatErrorMsg('ERROR:FAIL:{}'.format(cmd))) self.button.setEnabled(True) return # write a .sh bash script file on target if self.ckxtr3.isChecked() is True: sh_file = 'nuitka_compile_python_to_cpp.sh' with open(path.join(str(self.outdir.text()), sh_file), 'w') as _sh: self.output.append(self.formatInfoMsg('''INFO: OK: Writing Bash: {}'''.format(sh_file))) _sh.write('#!/usr/bin/env bash {}{}'.format(linesep, cmd)) _sh.close() self.output.append(self.formatInfoMsg('INFO: OK: Bash chmod: 775')) try: chmod(path.join(str(self.outdir.text()), sh_file), 0775) # Py2 except: chmod(path.join(str(self.outdir.text()), sh_file), 0o775) # Py3 def _process_finished(self): """sphinx-build finished sucessfully""" self.output.append(self.formatInfoMsg('INFO:{}'.format(datetime.now()))) if self.ckxtr2.isChecked() is True: log_file = 'nuitka_ninja.log' with open(path.join(str(self.outdir.text()), log_file), 'w') as log: self.output.append(self.formatInfoMsg('''INFO: OK: Writing LOG: {}'''.format(log_file))) log.write(self.output.toPlainText()) if self.ckxtr1.isChecked() is True: try: startfile(path.abspath(str(self.outdir.text()))) except: Popen(["xdg-open", path.abspath(str(self.outdir.text()))]) self.button.setDisabled(False) self.output.show() self.output.setFocus() self.output.selectAll() def toggle_gral_group(self): ' toggle on or off the checkboxes ' if self.group1.isChecked() is True: [a.setChecked(True) for a in (self.ckgrl1, self.ckgrl2, self.ckgrl4, self.ckgrl5, self.ckgrl6, self.ckgrl7, self.ckgrl8)] self.group1.graphicsEffect().setEnabled(False) else: [a.setChecked(False) for a in (self.ckgrl1, self.ckgrl2, self.ckgrl4, self.ckgrl5, self.ckgrl6, self.ckgrl7, self.ckgrl8)] self.group1.graphicsEffect().setEnabled(True) def readOutput(self): """Read and append sphinx-build output to the logBrowser""" self.output.append(str(self.process.readAllStandardOutput())) def readErrors(self): """Read and append sphinx-build errors to the logBrowser""" self.output.append(self.formatErrorMsg(str( self.process.readAllStandardError()))) def formatErrorMsg(self, msg): """Format error messages in red color""" return self.formatMsg(msg, 'red') def formatInfoMsg(self, msg): """Format informative messages in blue color""" return self.formatMsg(msg, 'green') def formatMsg(self, msg, color): """Format message with the given color""" return '<font color="{}">{}</font>'.format(color, msg)
class Main(plugin.Plugin): " Main Class " def initialize(self, *args, **kwargs): " Init Main Class " ec = ExplorerContainer() super(Main, self).initialize(*args, **kwargs) # directory auto completer self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.RUNS, self.FAILS = 0, 0 self.group0 = QGroupBox() self.group0.setTitle(' Source and Target ') self.baseurl = QLineEdit('http://google.com') self.outfile = QLineEdit(path.join(path.expanduser("~"), 'test.py')) self.outfile.setCompleter(self.completer) self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.clicked.connect(lambda: self.outfile.setText( QFileDialog.getSaveFileName(self.dock, "Save", path.expanduser( "~"), 'PYTHON(*.py)'))) vboxg0 = QVBoxLayout(self.group0) for each_widget in (QLabel('<b>Base URL'), self.baseurl, QLabel('<b>Local File Target'), self.outfile, self.open): vboxg0.addWidget(each_widget) self.group1 = QGroupBox() self.group1.setTitle(' Selenium ') self.group1.setCheckable(True) self.group1.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group1.graphicsEffect().setEnabled(False) self.group1.toggled.connect(self.toggle_group) self.ckcss1 = QCheckBox('Test for correct Page Loading behaviour') self.ckcss2 = QCheckBox('Test for Sucessfull Status Code return') self.ckcss3 = QCheckBox('Test for valid Title of the web page') self.ckcss4 = QCheckBox('Test for Cookies Basic functionality') self.ckcss5 = QCheckBox('Test for Back, Forward, Reload behaviour') self.ckcss6 = QCheckBox('Take a Screenshot of page (CSS Debug)') self.ckcss7 = QCheckBox('Test for Search Form Field of the page') self.ckcss8 = QCheckBox( 'Test for Arbitrary Javascript (User provided)') self.ckcss9 = QCheckBox('Test for iFrame of the web page') self.ckcss10 = QCheckBox('Test for HTML5 Canvas element on the page') self.ckcss11 = QCheckBox('Test for HTML5 SVG element on the page') self.ckcss12 = QCheckBox('Test for HTML5 Audio element on the page') self.ckcss13 = QCheckBox('Test for HTML5 Video element on the page') self.ckcss14 = QCheckBox('Test for File Upload form on the page') self.ckcss15 = QCheckBox('Add ChromeDriver path to sys.path') self.webdriver = QComboBox() self.webdriver.addItems( ['firefox', 'chrome', 'zope.testbrowser', 'phantomjs']) self.titletxt = QLineEdit('Google') self.javascript = QLineEdit('console.log("test")') self.authdata, self.formdata = QLineEdit(), QLineEdit() self.authdata.setPlaceholderText( "{'username':'******','password':'******'}") self.formdata.setPlaceholderText("{'name': 'Joe', 'age': '25'}") self.iframurl = QLineEdit() self.chrmedrv = QLineEdit('/usr/bin/chromedriver') self.timeout = QSpinBox() self.timeout.setMaximum(99) self.timeout.setMinimum(0) self.timeout.setValue(9) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, QLabel('<b>WebDriver'), self.webdriver, QLabel('''<center><small><i>Firefox is only Driver that dont require additional configuration'''), QLabel('<b>Title Content must contain'), self.titletxt, QLabel('<b>Minified Javascript for Test'), self.javascript, QLabel('<b>Arbitrary Authentication Data for Test'), self.authdata, QLabel('<b>Arbitrary Form Data for Test'), self.formdata, QLabel('<b>iFrame URL for Test'), self.iframurl, QLabel('<b>Chrome Driver'), self.chrmedrv, QLabel('<b>Timeout Timer Limit'), self.timeout): vboxg1.addWidget(each_widget) try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) self.group4 = QGroupBox() self.group4.setTitle(' General ') self.chckbx1 = QCheckBox('Run the Tests after Writing') self.chckbx2 = QCheckBox('Open the Tests with Ninja after Writing') self.chckbx3 = QCheckBox('Add SheBang, Encoding and Metadata to Tests') self.nice = QSpinBox() self.nice.setMaximum(20) self.nice.setMinimum(0) self.nice.setValue(20) self.help1 = QLabel( '''<a href="http://splinter.cobrateam.info/docs/api" ><center><b>API Reference</a>''') self.help1.setTextInteractionFlags(Qt.LinksAccessibleByMouse) self.help1.setOpenExternalLinks(True) vboxg4 = QVBoxLayout(self.group4) for each_widget in (self.chckbx1, self.chckbx2, self.chckbx3, QLabel('Backend CPU priority:'), self.nice, self.help1): vboxg4.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) [ a.setChecked(True) for a in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss15, self.chckbx1, self.chckbx2, self.chckbx3) ] self.button = QPushButton(QIcon.fromTheme("face-cool"), 'Write and Run Test') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) glow.setEnabled(True) self.output = QPlainTextEdit() self.runs = QLabel('<font color="green"><b>Runs: 0') self.failures = QLabel('<font color="red"><b>Failures: 0') class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget( (QLabel('<b>Selenium Tests'), self.group0, self.group1, self.group4, QLabel('<b>Log'), self.output, self.runs, self.failures, self.button)) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ec.addTab(self.dock, "Selenium") QPushButton( QIcon.fromTheme("help-about"), 'About', self.dock).clicked.connect( lambda: QMessageBox.information(self.dock, __doc__, HELPMSG)) QPushButton( QIcon.fromTheme("media-record"), 'Record', self.group1, ).clicked.connect(lambda: QMessageBox.information( self.dock, __doc__, 'Not working. If you know how to make it Record, send me Pull Request' )) def run(self): ' run ' self.RUNS = self.RUNS + 1 self.runs.setText('<font color="green"><b>Runs: {}'.format(self.RUNS)) self.output.clear() self.output.append(self.formatInfoMsg('INFO:{}'.format( datetime.now()))) self.button.setDisabled(True) self.output.append(self.formatInfoMsg(' INFO: OK: Parsing Data ')) selenium_test = SELENIUM_TEMPLATE.format( HEADER if self.chckbx3.isChecked() is True else '', self.chrmedrv.text() if self.ckcss15.isChecked() is True else '', self.baseurl.text(), self.authdata.text() if str(self.authdata.text()) is not '' else {}, self.formdata.text() if str( self.formdata.text()) is not '' else {}, self.iframurl.text(), self.javascript.text(), self.titletxt.text(), self.webdriver.currentText(), '# ' if self.ckcss1.isChecked() is not True else '', '# ' if self.ckcss2.isChecked() is not True else '', '# ' if self.ckcss2.isChecked() is not True else '', '# ' if self.ckcss3.isChecked() is not True else '', '# ' if self.ckcss4.isChecked() is not True else '', '# ' if self.ckcss5.isChecked() is not True else '', '# ' if self.ckcss6.isChecked() is not True else '', '# ' if self.ckcss7.isChecked() is not True else '', '# ' if self.ckcss8.isChecked() is not True else '', '# ' if self.ckcss9.isChecked() is not True else '', '# ' if self.ckcss10.isChecked() is not True else '', '# ' if self.ckcss11.isChecked() is not True else '', '# ' if self.ckcss12.isChecked() is not True else '', '# ' if self.ckcss13.isChecked() is not True else '', '# ' if self.ckcss14.isChecked() is not True else '', self.timeout.value()) with open(path.abspath(self.outfile.text()), 'w') as f: self.output.append(self.formatInfoMsg(' INFO: OK: Writing Tests ')) f.write(selenium_test) if self.chckbx2.isChecked() is True: self.output.append(self.formatInfoMsg(' INFO: OK: Opening Tests ')) try: startfile(str(path.abspath(self.outfile.text()))) except: Popen(["ninja-ide", str(path.abspath(self.outfile.text()))]) if self.chckbx1.isChecked() is True: try: self.output.append( self.formatInfoMsg('INFO: OK: Runing Tests')) Popen(["python", str(path.abspath(self.outfile.text()))]) except: self.output.append( self.formatErrorMsg('INFO:FAIL: Tests Fail')) self.FAILS = self.FAILS + 1 self.failures.setText( '<font color="red"><b>Failures: {}'.format(self.FAILS)) self.output.append(self.formatInfoMsg('INFO:{}'.format( datetime.now()))) self.button.setDisabled(False) self.output.setFocus() self.output.selectAll() def toggle_group(self): ' toggle on or off the css checkboxes ' if self.group1.isChecked() is True: [ a.setChecked(True) for a in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss15) ] self.group1.graphicsEffect().setEnabled(False) else: [ a.setChecked(False) for a in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss15) ] self.group1.graphicsEffect().setEnabled(True) def formatErrorMsg(self, msg): """Format error messages in red color""" return self.formatMsg(msg, 'red') def formatInfoMsg(self, msg): """Format informative messages in blue color""" return self.formatMsg(msg, 'green') def formatMsg(self, msg, color): """Format message with the given color""" return '<font color="{}">{}</font>'.format(color, msg)