def run(self): progressLog = StringIO() debugLevel = logging.DEBUG if Any.getDebugLevel() > 3 else logging.INFO Any.addStreamLogger(progressLog, debugLevel, False) PackageCreator.runTemplate(self.templateName, self.packageName, self.packageVersion) self.newOutput.emit(progressLog.getvalue())
def __init__( self, model, parent=None ): super( CheckRoutineDialog, self ).__init__( parent ) self.installEventFilter( self ) self._model = model self._logOutput = StringIO() self._allRules = Rules.getRules() self._allRulesDict = {} self._checkSelected = False self._checkBoxes = {} self._checkButtons = {} self._commentFields = {} self._dirty = None self._safeplace = set() # avoid garbage-collection self._threads = {} self._textWidgets = {} self._textStates = {} self._resultWidgets = {} self._rowNumbers = {} self._desiredLevelName = None self._desiredLevelIndex = None self._desiredLevelLabel = QLabel( 'desired level:' ) self._desiredLevelCombo = QComboBox() self._windowTitle = 'Software Quality settings' Any.addStreamLogger( self._logOutput, logging.DEBUG, preamble=False ) for level in CheckRoutine.sqLevelNames: text = CheckRoutine.sqLevels[ level ] self._desiredLevelCombo.addItem( text, level ) self._defaultLevel = CheckRoutine.sqLevelDefault self._defaultIndex = CheckRoutine.sqLevelNames.index( self._defaultLevel ) self._desiredLevelCombo.setCurrentIndex( self._model.getSQLevelIndex() ) # do this only once after all entries have been added, otherwise each # add would already (unnecessarily) trigger the slot self._desiredLevelCombo.currentIndexChanged.connect( self._toggleCombo ) self._desiredLevelLayout = QHBoxLayout() self._desiredLevelLayout.addWidget( self._desiredLevelLabel ) self._desiredLevelLayout.addWidget( self._desiredLevelCombo ) self._desiredLevelLayout.addStretch( 1 ) self._desiredLevelWidget = QWidget() self._desiredLevelWidget.setLayout( self._desiredLevelLayout ) columns = ( 'rule', 'description', 'required', 'verify', 'result', 'comments' ) self._table = QTableWidget() self._table.setRowCount( len( self._allRules ) + len( CheckRoutine.sectionKeys ) ) self._table.setColumnCount( len(columns) ) self._table.setHorizontalHeaderLabels( columns ) self._table.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Expanding ) self._table.setAutoScroll( False ) self._cellHeightNormal = 60 self._cellHeightExpanded = 200 self._hHeader = self._table.horizontalHeader() self._hHeader.setSectionResizeMode( 1, QHeaderView.Stretch ) self._hHeader.setSectionResizeMode( 4, QHeaderView.Stretch ) self._hHeader.setSectionResizeMode( 5, QHeaderView.Stretch ) self._hHeader.setSectionsClickable( False ) self._vHeader = self._table.verticalHeader() self._vHeader.setDefaultSectionSize( self._cellHeightNormal ) self._vHeader.hide() i = 0 expr = re.compile( "^([A-Z]+)\d+$" ) prevKey = None for ( ruleID, rule ) in self._allRules: # whenever the rule key (e.g. "C", "GEN", "SPEC",...) changes then # insert a table row with title and objective key = expr.match( ruleID ).group( 1 ) Any.requireIsTextNonEmpty( key ) if key != prevKey: prevKey = key sectionName = CheckRoutine.sectionNames[ key ] Any.requireIsTextNonEmpty( sectionName ) sectionObjective = CheckRoutine.sectionObjectives[ key ] Any.requireIsTextNonEmpty( sectionObjective ) text = '<h2>%s</h2><i>Objective: %s</i>' % ( sectionName, sectionObjective ) cellWidget = QTextEdit( text ) cellWidget.setReadOnly( True ) cellWidget.setFrameStyle( QFrame.NoFrame ) self._table.setCellWidget( i, 0, cellWidget ) self._table.setSpan( i, 0, 1, len(columns) ) i += 1 # keep references to rules and numbers self._allRulesDict[ ruleID ] = rule self._rowNumbers[ ruleID ] = i # column 0: rule IDs cellWidget = QTextEdit( ruleID ) cellWidget.setReadOnly( True ) cellWidget.setFrameStyle( QFrame.NoFrame ) self._table.setCellWidget( i, 0, cellWidget ) # column 1: rule description text = rule.brief if rule.description: text += ' [More...](expand-%s.html)' % ruleID cellWidget = QTextBrowser() cellWidget.setHtml( markdown.markdown( text ) ) cellWidget.setReadOnly( True ) cellWidget.setOpenLinks( False ) cellWidget.setOpenExternalLinks( False ) cellWidget.setFrameStyle( QFrame.NoFrame ) cellWidget.anchorClicked.connect( self._toggleDescription ) self._table.setCellWidget( i, 1, cellWidget ) self._textWidgets[ ruleID ] = cellWidget self._textStates[ ruleID ] = False # False/True = short/long # column 2: pre-selection for desired SQ level cellWidget = QWidget() checkbox = QCheckBox() checkbox.setChecked( False ) checkbox.stateChanged.connect( self._toggleCheckbox ) checkbox.stateChanged.connect( self._setDirtyFlag ) cellLayout = QHBoxLayout() cellLayout.setAlignment( Qt.AlignCenter ) cellLayout.addWidget( checkbox ) cellWidget.setLayout( cellLayout ) self._table.setCellWidget( i, 2, cellWidget ) if rule.removed: checkbox.setEnabled( False ) self._safeplace.add( checkbox ) else: self._checkBoxes[ ruleID ] = checkbox # column 3: check buttons button = QPushButton( 'Check' ) button.clicked.connect( functools.partial( self._run, rule ) ) cellLayout = QHBoxLayout() cellLayout.addWidget( button ) cellWidget = QWidget() cellWidget.setLayout( cellLayout ) self._table.setCellWidget( i, 3, cellWidget ) if rule.removed: button.setEnabled( False ) self._safeplace.add( button ) else: self._checkButtons[ ruleID ] = button # column 4: checker output / result cellWidget = QTextEdit() cellWidget.setReadOnly( True ) cellWidget.setFrameStyle( QFrame.NoFrame ) self._table.setCellWidget( i, 4, cellWidget ) self._resultWidgets[ ruleID ] = cellWidget # column 5: comments field cellWidget = QTextEdit() cellWidget.setFrameStyle( QFrame.NoFrame ) cellWidget.textChanged.connect( self._setDirtyFlag ) self._table.setCellWidget( i, 5, cellWidget ) self._commentFields[ ruleID ] = cellWidget i += 1 self._runSelectedButton = QPushButton( 'Check &selected' ) self._runSelectedButton.setEnabled( False ) # toggle via checkboxes self._runSelectedButton.setToolTip( 'verify all rules where checkbox is selected' ) self._runSelectedButton.pressed.connect( self._runSelected ) self._restoreButton = QPushButton( '&Restore defaults' ) self._restoreButton.setToolTip( 'Set to default values' ) self._restoreButton.pressed.connect( self._restoreSettings ) self._saveButton = QPushButton( '&Save selection and comments' ) self._saveButton.setToolTip( 'Save settings to pkgInfo.py file' ) self._saveButton.pressed.connect( self._saveSettings ) self._okButton = QPushButton( '&OK' ) self._okButton.pressed.connect( self.close ) self._mainButtonsLayout = QHBoxLayout() self._mainButtonsLayout.setAlignment( Qt.AlignRight ) self._mainButtonsLayout.addWidget( self._runSelectedButton ) self._mainButtonsLayout.addWidget( self._restoreButton ) self._mainButtonsLayout.addWidget( self._saveButton ) self._mainButtonsLayout.addWidget( self._okButton ) self._mainButtonsWidget = QWidget() self._mainButtonsWidget.setLayout( self._mainButtonsLayout ) self._groupBoxLayout = QVBoxLayout() self._groupBoxLayout.addWidget( self._desiredLevelWidget ) self._groupBoxLayout.addWidget( self._table ) self._groupBoxWidget = QGroupBox( self._windowTitle ) self._groupBoxWidget.setLayout( self._groupBoxLayout ) self._layout = QVBoxLayout() self._layout.addWidget( self._groupBoxWidget ) self._layout.addWidget( self._mainButtonsWidget ) # noinspection PyArgumentList screen = QApplication.desktop().screenGeometry() dialogWidth = screen.width() / 4 * 3 dialogHeight = screen.height() / 4 * 3 self.setLayout( self._layout ) self.setWindowIcon( IconProvider.getIcon( 'QualityGuideline' ) ) self.setWindowTitle( self._windowTitle ) self.resize( dialogWidth, dialogHeight ) self.move( screen.center() - self.rect().center() ) # center # pre-initialize check-state of all checkboxes depending on combobox, # this must be done after all checkboxes, combobox, and also the # "check selected" button are created self._toggleCombo() for ruleID in self._model.getSQOptInRules(): self._checkBoxes[ ruleID ].setChecked( True ) for ruleID in self._model.getSQOptOutRules(): self._checkBoxes[ ruleID ].setChecked( False ) for ruleID, comment in self._model.getSQComments().items(): self._commentFields[ ruleID ].setText( comment ) self._okButton.setDefault( True ) self._dirty = False self.show()