Exemplo n.º 1
0
    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()