Sun, 25 Nov 2018 18:32:27 +0100
Upgraded the embedded Radon library to version 2.4.0.
--- a/ChangeLog Sat Mar 31 13:05:51 2018 +0200 +++ b/ChangeLog Sun Nov 25 18:32:27 2018 +0100 @@ -1,5 +1,9 @@ ChangeLog --------- +Version 2.0.0: +- bug fixes +- upgraded embedded Radon library to version 2.4.0 + Version 1.1.1: - updated translations
--- a/PKGLIST Sat Mar 31 13:05:51 2018 +0200 +++ b/PKGLIST Sun Nov 25 18:32:27 2018 +0100 @@ -14,6 +14,7 @@ RadonMetrics/i18n/radon_en.qm RadonMetrics/i18n/radon_es.qm RadonMetrics/i18n/radon_ru.qm +RadonMetrics/radon/LICENSE RadonMetrics/radon/__init__.py RadonMetrics/radon/complexity.py RadonMetrics/radon/metrics.py
--- a/PluginMetricsRadon.e4p Sat Mar 31 13:05:51 2018 +0200 +++ b/PluginMetricsRadon.e4p Sun Nov 25 18:32:27 2018 +0100 @@ -52,6 +52,7 @@ <Other>PluginMetricsRadon.zip</Other> <Other>RadonMetrics/Documentation/LICENSE.GPL3</Other> <Other>RadonMetrics/Documentation/source</Other> + <Other>RadonMetrics/radon/LICENSE</Other> </Others> <MainScript>PluginMetricsRadon.py</MainScript> <Vcs> @@ -391,7 +392,7 @@ <string>ExcludeFiles</string> </key> <value> - <string></string> + <string>*/radon/*</string> </value> <key> <string>MinimumRank</string>
--- a/PluginMetricsRadon.py Sat Mar 31 13:05:51 2018 +0200 +++ b/PluginMetricsRadon.py Sun Nov 25 18:32:27 2018 +0100 @@ -28,7 +28,7 @@ author = "Detlev Offenbach <detlev@die-offenbachs.de>" autoactivate = True deactivateable = True -version = "1.1.1" +version = "2.0.0" className = "RadonMetricsPlugin" packageName = "RadonMetrics" shortDescription = "Code metrics plugin using radon package" @@ -804,6 +804,7 @@ menu.addActions(self.__editorMetricsActs) menu.addAction(self.__editorSeparatorActs[1]) editor.showMenu.connect(self.__editorShowMenu) + editor.editorRenamed.connect(lambda: self.__editorRenamed(editor)) self.__editors.append(editor) def __editorClosed(self, editor): @@ -817,6 +818,19 @@ except ValueError: pass + def __editorRenamed(self, editor): + """ + Private slot called, when an editor was renamed. + + @param editor reference to the renamed editor + @type QScintilla.Editor + """ + menu = editor.getMenu("Show") + if menu is not None: + menu.addAction(self.__editorSeparatorActs[0]) + menu.addActions(self.__editorMetricsActs) + menu.addAction(self.__editorSeparatorActs[1]) + def __editorShowMenu(self, menuName, menu, editor): """ Private slot called, when the the editor context menu or a submenu is @@ -1003,7 +1017,8 @@ if self.__projectBrowserCCDialog is None: from RadonMetrics.CyclomaticComplexityDialog import \ CyclomaticComplexityDialog - self.__projectBrowserCCDialog = CyclomaticComplexityDialog(self) + self.__projectBrowserCCDialog = CyclomaticComplexityDialog( + self, isSingle=True) self.__projectBrowserCCDialog.show() self.__projectBrowserCCDialog.start(fn) @@ -1018,7 +1033,8 @@ if self.__editorCCDialog is None: from RadonMetrics.CyclomaticComplexityDialog import \ CyclomaticComplexityDialog - self.__editorCCDialog = CyclomaticComplexityDialog(self) + self.__editorCCDialog = CyclomaticComplexityDialog( + self, isSingle=True) self.__editorCCDialog.show() self.__editorCCDialog.start(editor.getFileName())
--- a/RadonMetrics/CyclomaticComplexityCalculator.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/CyclomaticComplexityCalculator.py Sun Nov 25 18:32:27 2018 +0100 @@ -193,8 +193,8 @@ Private function to convert an object holding cyclomatic complexity results into a dictionary. - @param obj object as returned from analyze() - @type radon.raw.Module + @param obj object as returned from cc_visit() + @type radon.visitors.Function @return conversion result @rtype dict """
--- a/RadonMetrics/CyclomaticComplexityDialog.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/CyclomaticComplexityDialog.py Sun Nov 25 18:32:27 2018 +0100 @@ -42,12 +42,14 @@ FilePathRole = Qt.UserRole + 1 LineNumberRole = Qt.UserRole + 2 - def __init__(self, radonService, parent=None): + def __init__(self, radonService, isSingle=False, parent=None): """ Constructor @param radonService reference to the service @type RadonMetricsPlugin + @param isSingle flag indicating a single file dialog + @type bool @param parent reference to the parent widget @type QWidget """ @@ -69,6 +71,7 @@ self.radonService.error.connect(self.__processError) self.radonService.batchFinished.connect(self.__batchFinished) + self.__isSingle = isSingle self.cancelled = False self.__project = e5App().getObject("Project") @@ -251,15 +254,16 @@ @param minRank minimum rank of entries to be shown @type str (one character out of A - F) """ + self.cancelled = False self.__errorItem = None self.resultList.clear() self.summaryLabel.clear() - self.cancelled = False QApplication.processEvents() self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) + self.rankComboBox.setEnabled(False) QApplication.processEvents() if isinstance(fn, list): @@ -278,6 +282,8 @@ for f in self.files[:]: if not os.path.exists(f): self.files.remove(f) + if self.__isSingle: + self.__fileList = self.files[:] self.__summary = { "A": 0, @@ -290,7 +296,7 @@ self.__ccSum = 0 self.__ccCount = 0 - self.__minimumRank = minRank + self.__minimumRank = self.rankComboBox.currentText() if len(self.files) > 0: # disable updates of the list for speed @@ -475,6 +481,7 @@ self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True) self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Close).setDefault(True) + self.rankComboBox.setEnabled(True) self.resultList.header().resizeSections( QHeaderView.ResizeToContents) @@ -567,7 +574,7 @@ self.__project.setData( "OTHERTOOLSPARMS", "RadonCodeMetrics", self.__data) - self.start(fileList, minRank=minimumRank) + self.start(fileList) def __showContextMenu(self, coord): """ @@ -614,3 +621,14 @@ if filename: vm = e5App().getObject("ViewManager") vm.openSourceFile(filename, lineno) + + @pyqtSlot(str) + def on_rankComboBox_activated(self, rank): + """ + Private slot to handle the selection of a minimum rank. + + @param rank selected minimum rank + @type str + """ + if self.__isSingle: + self.start(self.__fileList[:])
--- a/RadonMetrics/CyclomaticComplexityDialog.ui Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/CyclomaticComplexityDialog.ui Sun Nov 25 18:32:27 2018 +0100 @@ -22,76 +22,99 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QFrame" name="filterFrame"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Minimum Rank:</string> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="rankComboBox"> - <property name="toolTip"> - <string>Select the minimum rank of items to be shown</string> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Minimum Rank:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="rankComboBox"> + <property name="toolTip"> + <string>Select the minimum rank of items to be shown</string> + </property> + </widget> + </item> + <item> + <spacer name="filterSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QFrame" name="filterFrame"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>10</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="leftMargin"> + <number>0</number> </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Exclude Files:</string> + <property name="topMargin"> + <number>0</number> </property> - </widget> - </item> - <item> - <widget class="E5ClearableLineEdit" name="excludeFilesEdit"> - <property name="toolTip"> - <string>Enter filename patterns of files to be excluded separated by a comma</string> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> </property> - </widget> - </item> - <item> - <widget class="Line" name="line"> - <property name="lineWidth"> - <number>2</number> - </property> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="startButton"> - <property name="toolTip"> - <string>Press to start the calculation</string> - </property> - <property name="text"> - <string>Start</string> - </property> - </widget> - </item> - </layout> - </widget> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Exclude Files:</string> + </property> + </widget> + </item> + <item> + <widget class="E5ClearableLineEdit" name="excludeFilesEdit"> + <property name="toolTip"> + <string>Enter filename patterns of files to be excluded separated by a comma</string> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line"> + <property name="lineWidth"> + <number>2</number> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="startButton"> + <property name="toolTip"> + <string>Press to start the calculation</string> + </property> + <property name="text"> + <string>Start</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> </item> <item> <widget class="QTreeWidget" name="resultList">
--- a/RadonMetrics/Documentation/source/Plugin_Metrics_Radon.PluginMetricsRadon.html Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/Documentation/source/Plugin_Metrics_Radon.PluginMetricsRadon.html Sun Nov 25 18:32:27 2018 +0100 @@ -96,6 +96,9 @@ <td><a href="#RadonMetricsPlugin.__editorRawMetrics">__editorRawMetrics</a></td> <td>Private slot to handle the raw code metrics action of the editor show menu.</td> </tr><tr> +<td><a href="#RadonMetricsPlugin.__editorRenamed">__editorRenamed</a></td> +<td>Private slot called, when an editor was renamed.</td> +</tr><tr> <td><a href="#RadonMetricsPlugin.__editorShowMenu">__editorShowMenu</a></td> <td>Private slot called, when the the editor context menu or a submenu is about to be shown.</td> </tr><tr> @@ -236,7 +239,17 @@ <p> Private slot to handle the raw code metrics action of the editor show menu. -</p><a NAME="RadonMetricsPlugin.__editorShowMenu" ID="RadonMetricsPlugin.__editorShowMenu"></a> +</p><a NAME="RadonMetricsPlugin.__editorRenamed" ID="RadonMetricsPlugin.__editorRenamed"></a> +<h4>RadonMetricsPlugin.__editorRenamed</h4> +<b>__editorRenamed</b>(<i>editor</i>) +<p> + Private slot called, when an editor was renamed. +</p><dl> +<dt><i>editor</i> (QScintilla.Editor)</dt> +<dd> +reference to the renamed editor +</dd> +</dl><a NAME="RadonMetricsPlugin.__editorShowMenu" ID="RadonMetricsPlugin.__editorShowMenu"></a> <h4>RadonMetricsPlugin.__editorShowMenu</h4> <b>__editorShowMenu</b>(<i>menuName, menu, editor</i>) <p>
--- a/RadonMetrics/Documentation/source/Plugin_Metrics_Radon.RadonMetrics.CyclomaticComplexityCalculator.html Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/Documentation/source/Plugin_Metrics_Radon.RadonMetrics.CyclomaticComplexityCalculator.html Sun Nov 25 18:32:27 2018 +0100 @@ -67,9 +67,9 @@ Private function to convert an object holding cyclomatic complexity results into a dictionary. </p><dl> -<dt><i>obj</i> (radon.raw.Module)</dt> +<dt><i>obj</i> (radon.visitors.Function)</dt> <dd> -object as returned from analyze() +object as returned from cc_visit() </dd> </dl><dl> <dt>Returns:</dt>
--- a/RadonMetrics/Documentation/source/Plugin_Metrics_Radon.RadonMetrics.CyclomaticComplexityDialog.html Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/Documentation/source/Plugin_Metrics_Radon.RadonMetrics.CyclomaticComplexityDialog.html Sun Nov 25 18:32:27 2018 +0100 @@ -107,6 +107,9 @@ <td><a href="#CyclomaticComplexityDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td> <td>Private slot called by a button of the button box clicked.</td> </tr><tr> +<td><a href="#CyclomaticComplexityDialog.on_rankComboBox_activated">on_rankComboBox_activated</a></td> +<td>Private slot to handle the selection of a minimum rank.</td> +</tr><tr> <td><a href="#CyclomaticComplexityDialog.on_resultList_itemActivated">on_resultList_itemActivated</a></td> <td>Private slot to handle the activation of a result item.</td> </tr><tr> @@ -126,13 +129,16 @@ </table> <a NAME="CyclomaticComplexityDialog.__init__" ID="CyclomaticComplexityDialog.__init__"></a> <h4>CyclomaticComplexityDialog (Constructor)</h4> -<b>CyclomaticComplexityDialog</b>(<i>radonService, parent=None</i>) +<b>CyclomaticComplexityDialog</b>(<i>radonService, isSingle=False, parent=None</i>) <p> Constructor </p><dl> <dt><i>radonService</i> (RadonMetricsPlugin)</dt> <dd> reference to the service +</dd><dt><i>isSingle</i> (bool)</dt> +<dd> +flag indicating a single file dialog </dd><dt><i>parent</i> (QWidget)</dt> <dd> reference to the parent widget @@ -288,6 +294,16 @@ <dd> button that was clicked </dd> +</dl><a NAME="CyclomaticComplexityDialog.on_rankComboBox_activated" ID="CyclomaticComplexityDialog.on_rankComboBox_activated"></a> +<h4>CyclomaticComplexityDialog.on_rankComboBox_activated</h4> +<b>on_rankComboBox_activated</b>(<i>rank</i>) +<p> + Private slot to handle the selection of a minimum rank. +</p><dl> +<dt><i>rank</i> (str)</dt> +<dd> +selected minimum rank +</dd> </dl><a NAME="CyclomaticComplexityDialog.on_resultList_itemActivated" ID="CyclomaticComplexityDialog.on_resultList_itemActivated"></a> <h4>CyclomaticComplexityDialog.on_resultList_itemActivated</h4> <b>on_resultList_itemActivated</b>(<i>item, column</i>)
--- a/RadonMetrics/MaintainabilityIndexDialog.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/MaintainabilityIndexDialog.py Sun Nov 25 18:32:27 2018 +0100 @@ -72,10 +72,11 @@ self.explanationLabel.setText(self.tr( "<table>" - "<tr><td colspan=2><b>Ranking:</b></td></tr>" - "<tr><td><b>A</b></td><td>score > 19</td></tr>" - "<tr><td><b>B</b></td><td>9 < score ≤ 19</td></tr>" - "<tr><td><b>C</b></td><td>score ≤ 9</td></tr>" + "<tr><td><b>Rank</b></td><td><b>MI Score</b></td>" + "<td><b>Maintainability</b></td></tr>" + "<tr><td><b>A</b></td><td>100 - 20</td><td>very high</td></tr>" + "<tr><td><b>B</b></td><td>19 - 10</td><td>medium</td></tr>" + "<tr><td><b>C</b></td><td>9 - 0</td><td>extremely low</td></tr>" "</table>" )) self.__rankColors = {
--- a/RadonMetrics/RawMetricsDialog.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/RawMetricsDialog.py Sun Nov 25 18:32:27 2018 +0100 @@ -82,6 +82,8 @@ "<tr><td><b>SLOC</b></td><td>Source lines of code</td></tr>" "<tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr>" "<tr><td><b>Comments</b></td><td>Comment lines</td></tr>" + "<tr><td><b>Empty Comments</b></td><td>Comment lines not" + " containing code</td></tr>" "<tr><td><b>Multi</b></td>" "<td>Lines in multi line strings</td></tr>" "<tr><td><b>Empty</b></td><td>Blank lines</td></tr>" @@ -182,10 +184,10 @@ the code metrics for @type str or list of str """ + self.cancelled = False self.__errorItem = None self.resultList.clear() self.summaryList.clear() - self.cancelled = False QApplication.processEvents() self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) @@ -211,7 +213,8 @@ self.files.remove(f) self.__summary = {"files": 0} - for key in ['loc', 'sloc', 'lloc', 'comments', 'multi', 'blank']: + for key in ['loc', 'lloc', 'sloc', 'comments', 'multi', + 'single_comments', 'blank']: self.__summary[key] = 0 if len(self.files) > 0: @@ -375,9 +378,10 @@ @rtype list of str """ v = [] - for key in ['loc', 'sloc', 'lloc', 'comments', 'multi', 'blank']: - val = result.get(key, 0) - if val: + for key in ['loc', 'sloc', 'lloc', 'comments', 'multi', + 'single_comments', 'blank']: + val = result.get(key, -1) + if val >= 0: v.append(self.__locale.toString(val)) else: v.append('') @@ -432,6 +436,9 @@ self.tr("Comment Lines"), self.__locale.toString(self.__summary["comments"])) self.__createSummaryItem( + self.tr("Empty Comments"), + self.__locale.toString(self.__summary["single_comments"])) + self.__createSummaryItem( self.tr("Multiline Strings"), self.__locale.toString(self.__summary["multi"])) self.__createSummaryItem(
--- a/RadonMetrics/RawMetricsDialog.ui Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/RawMetricsDialog.ui Sun Nov 25 18:32:27 2018 +0100 @@ -111,6 +111,11 @@ </column> <column> <property name="text"> + <string>Empty Comments</string> + </property> + </column> + <column> + <property name="text"> <string>Multi</string> </property> </column>
--- a/RadonMetrics/i18n/radon_de.ts Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/i18n/radon_de.ts Sun Nov 25 18:32:27 2018 +0100 @@ -15,102 +15,102 @@ <p>Dieser Dialog zeigt die zyklomatische Komplexität und eine Bewertung.</p></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="62"/> + <location filename="../CyclomaticComplexityDialog.ui" line="83"/> <source>Exclude Files:</source> <translation>Ignoriere Dateien:</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="69"/> + <location filename="../CyclomaticComplexityDialog.ui" line="90"/> <source>Enter filename patterns of files to be excluded separated by a comma</source> <translation>Gib Dateimuster getrennt durch Komma von Dateien ein, die ignoriert werden sollen</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="89"/> + <location filename="../CyclomaticComplexityDialog.ui" line="110"/> <source>Start</source> <translation>Starten</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="106"/> + <location filename="../CyclomaticComplexityDialog.ui" line="129"/> <source>Type</source> <translation>Typ</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="111"/> + <location filename="../CyclomaticComplexityDialog.ui" line="134"/> <source>Name</source> <translation>Name</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="116"/> + <location filename="../CyclomaticComplexityDialog.ui" line="139"/> <source>Complexity</source> <translation>Komplexität</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="121"/> + <location filename="../CyclomaticComplexityDialog.ui" line="144"/> <source>Rank</source> <translation>Bewertung</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="196"/> + <location filename="../CyclomaticComplexityDialog.ui" line="219"/> <source>%v/%m Files</source> <translation>%v/%m Dateien</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="82"/> + <location filename="../CyclomaticComplexityDialog.py" line="85"/> <source><table><tr><td colspan=3><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>1 - 5</td><td>(low risk - simple block)</td></tr><tr><td><b>B</b></td><td>6 - 10</td><td>(low risk - well structured and stable block)</td></tr><tr><td><b>C</b></td><td>11 - 20</td><td>(moderate risk - slightly complex block)</td></tr><tr><td><b>D</b></td><td>21 - 30</td><td>(more than moderate risk - more complex block)</td></tr><tr><td><b>E</b></td><td>31 - 40</td><td>(high risk - complex block, alarming)</td></tr><tr><td><b>F</b></td><td>&gt; 40</td><td>(very high risk - error-prone, unstable block)</td></tr></table></source> <translation><table><tr><td colspan=3><b>Bewertung:</b></td></tr><tr><td><b>A</b></td><td>1 - 5</td><td>(geringes Risiko - einfacher Block)</td></tr><tr><td><b>B</b></td><td>6 - 10</td><td>(geringes Risika - gut strukturierter und stabiler Block)</td></tr><tr><td><b>C</b></td><td>11 - 20</td><td>(moderates Risiko - etwas komplexerer Block)</td></tr><tr><td><b>D</b></td><td>21 - 30</td><td>(mehr als moderates Risiko - komplexerer Block)</td></tr><tr><td><b>E</b></td><td>31 - 40</td><td>(hohes Risiko - komplexer Block, alarmierend)</td></tr><tr><td><b>F</b></td><td>&gt; 40</td><td>(sehr hohes Risiko - fehleranfälliger, instabiler Block)</td></tr></table></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="99"/> + <location filename="../CyclomaticComplexityDialog.py" line="102"/> <source><table><tr><td colspan=2><b>Type:</b></td></tr><tr><td><b>C</b></td><td>Class</td></tr><tr><td><b>F</b></td><td>Function</td></tr><tr><td><b>M</b></td><td>Method</td></tr></table></source> <translation><table><tr><td colspan=2><b>Typ:</b></td></tr><tr><td><b>C</b></td><td>Klasse</td></tr><tr><td><b>F</b></td><td>Funktion</td></tr><tr><td><b>M</b></td><td>Methode</td></tr></table></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="203"/> + <location filename="../CyclomaticComplexityDialog.py" line="206"/> <source>Errors</source> <translation>Fehler</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="361"/> + <location filename="../CyclomaticComplexityDialog.py" line="367"/> <source>Preparing files...</source> <translation>Bereite Dateien vor...</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="86"/> + <location filename="../CyclomaticComplexityDialog.ui" line="107"/> <source>Press to start the calculation</source> <translation>Drücken, um die Berechnung zu starten</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="187"/> + <location filename="../CyclomaticComplexityDialog.ui" line="210"/> <source>Shows the progress of the calculation</source> <translation>Zeigt den Fortschritt der Berechnung</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="126"/> + <location filename="../CyclomaticComplexityDialog.ui" line="149"/> <source>Begin</source> <translation>Anfang</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="128"/> + <location filename="../CyclomaticComplexityDialog.py" line="131"/> <source>Collapse all</source> <translation>Alle Zuklappen</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="130"/> + <location filename="../CyclomaticComplexityDialog.py" line="133"/> <source>Expand all</source> <translation>Alle Aufklappen</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="48"/> + <location filename="../CyclomaticComplexityDialog.ui" line="29"/> <source>Minimum Rank:</source> <translation>Mindestbewertung:</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="55"/> + <location filename="../CyclomaticComplexityDialog.ui" line="36"/> <source>Select the minimum rank of items to be shown</source> <translation>Wähle die Mindestbewertung anzuzeigender Einträge</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="490"/> + <location filename="../CyclomaticComplexityDialog.py" line="497"/> <source><b>Summary:</b><br/>{0} blocks (classes, functions, methods) analyzed.<br/>Average complexity: {7} ({8})<table><tr><td width=30><b>A</b></td><td align='right'>{1} blocks</td></tr><tr><td width=30><b>B</b></td><td align='right'>{2} blocks</td></tr><tr><td width=30><b>C</b></td><td align='right'>{3} blocks</td></tr><tr><td width=30><b>D</b></td><td align='right'>{4} blocks</td></tr><tr><td width=30><b>E</b></td><td align='right'>{5} blocks</td></tr><tr><td width=30><b>F</b></td><td align='right'>{6} blocks</td></tr></table></source> <translation><b>Zusammenfassung:</b><br/>{0} Blöcke (Klassen, Funktionen, Methoden) analysiert.<br/>Mittlere Komplexität: {7} ({8})<table><tr><td width=30><b>A</b></td><td align='right'>{1} Blöcke</td></tr><tr><td width=30><b>B</b></td><td align='right'>{2} Blöcke</td></tr><tr><td width=30><b>C</b></td><td align='right'>{3} Blöcke</td></tr><tr><td width=30><b>D</b></td><td align='right'>{4} Blöcke</td></tr><tr><td width=30><b>E</b></td><td align='right'>{5} Blöcke</td></tr><tr><td width=30><b>F</b></td><td align='right'>{6} Blöcke</td></tr></table></translation> </message> @@ -158,17 +158,12 @@ <translation>%v/%m Dateien</translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="73"/> - <source><table><tr><td colspan=2><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>score &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; score &le; 19</td></tr><tr><td><b>C</b></td><td>score &le; 9</td></tr></table></source> - <translation><table><tr><td colspan=2><b>Bewertung:</b></td></tr><tr><td><b>A</b></td><td>Wert &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; Wert &le; 19</td></tr><tr><td><b>C</b></td><td>Wert &le; 9</td></tr></table></translation> - </message> - <message> - <location filename="../MaintainabilityIndexDialog.py" line="130"/> + <location filename="../MaintainabilityIndexDialog.py" line="131"/> <source>Errors</source> <translation>Fehler</translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="274"/> + <location filename="../MaintainabilityIndexDialog.py" line="275"/> <source>Preparing files...</source> <translation>Bereite Dateien vor...</translation> </message> @@ -190,10 +185,15 @@ <p>Dieser Dialog zeigt den Wartbarkeitsindex und eine Bewertung.</p></translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="386"/> + <location filename="../MaintainabilityIndexDialog.py" line="387"/> <source><table><tr><td colspan=2><b>Summary:</b></td></tr><tr><td><b>A</b></td><td align='right'>{0} files</td></tr><tr><td><b>B</b></td><td align='right'>{1} files</td></tr><tr><td><b>C</b></td><td align='right'>{2} files</td></tr></table></source> <translation><table><tr><td colspan=2><b>Zusammenfassung:</b></td></tr><tr><td><b>A</b></td><td align='right'>{0} Dateien</td></tr><tr><td><b>B</b></td><td align='right'>{1} Dateien</td></tr><tr><td><b>C</b></td><td align='right'>{2} Dateien</td></tr></table></translation> </message> + <message> + <location filename="../MaintainabilityIndexDialog.py" line="73"/> + <source><table><tr><td><b>Rank</b></td><td><b>MI Score</b></td><td><b>Maintainability</b></td></tr><tr><td><b>A</b></td><td>100 - 20</td><td>very high</td></tr><tr><td><b>B</b></td><td>19 - 10</td><td>medium</td></tr><tr><td><b>C</b></td><td>9 - 0</td><td>extremely low</td></tr></table></source> + <translation><table><tr><td><b>Rang</b></td><td><b>Wert</b></td><td><b>Wartbarkeit</b></td></tr><tr><td><b>A</b></td><td>100 - 20</td><td>sehr hoch</td></tr><tr><td><b>B</b></td><td>19 - 10</td><td>mittel</td></tr><tr><td><b>C</b></td><td>9 - 0</td><td>extrem niedrig</td></tr></table></translation> + </message> </context> <context> <name>RadonMetricsPlugin</name> @@ -213,7 +213,7 @@ <translation>Unbekannte Metrik empfangen ({0}).</translation> </message> <message> - <location filename="../../PluginMetricsRadon.py" line="1035"/> + <location filename="../../PluginMetricsRadon.py" line="1051"/> <source>Radon</source> <translation>Radon</translation> </message> @@ -278,7 +278,7 @@ <translation><b>Zyklomatische Komplexität...</b><p>Dies ermittelt die zyklomatische Komplexität von Python Dateien und zeigt sie zusammen mit einer Bewertung an.</p></translation> </message> <message> - <location filename="../../PluginMetricsRadon.py" line="1035"/> + <location filename="../../PluginMetricsRadon.py" line="1051"/> <source><p><b>Radon Version {0}</b></p><p>Radon is a Python tool that computes various metrics from the source code. Radon can compute:<ul><li><b>Raw</b> metrics (these include SLOC, comment lines, blank lines, multi line strings, ...)</li><li><b>Maintainability Index</b> (the one used in Visual Studio)</li><li><b>McCabe's complexity</b>, i.e. cyclomatic complexity</li></ul></p></source> <translation><p><b>Radon Version {0}</b><p>Radon ist ein Werkzeug, das verschiedene Metriken für Python Quelltexte ermittelt. Radon kann die folgenden Metriken ermitteln:<ul><li><b>Quelltext</b>metrik (dies beinhaltet Quelltextzeilen, Kommentarzeilen, Leerzeilen, mehrzeilige Zeichenketten, ...)</li><li><b>Wartbarkeitsindex</b> (wie von Visual Studio)</li><li><b>McCabe Komplexität</b>, d.h. zyklomatische Komplexität</li></ul></p></translation> </message> @@ -318,17 +318,17 @@ <translation>Name</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="425"/> + <location filename="../RawMetricsDialog.py" line="429"/> <source>LOC</source> <translation>LOC</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="427"/> + <location filename="../RawMetricsDialog.py" line="431"/> <source>SLOC</source> <translation>SLOC</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="429"/> + <location filename="../RawMetricsDialog.py" line="433"/> <source>LLOC</source> <translation>LLOC</translation> </message> @@ -338,62 +338,57 @@ <translation>Kommentare</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="114"/> + <location filename="../RawMetricsDialog.ui" line="119"/> <source>Multi</source> <translation>Mehrfach</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="119"/> + <location filename="../RawMetricsDialog.ui" line="124"/> <source>Empty</source> <translation>Leer</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="124"/> + <location filename="../RawMetricsDialog.ui" line="129"/> <source>C % L</source> <translation>K % L</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="129"/> + <location filename="../RawMetricsDialog.ui" line="134"/> <source>C % S</source> <translation>K % S</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="134"/> + <location filename="../RawMetricsDialog.ui" line="139"/> <source>C + M % L</source> <translation>K + M % L</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="159"/> + <location filename="../RawMetricsDialog.ui" line="164"/> <source>Summary</source> <translation>Zusammenfassung</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="164"/> + <location filename="../RawMetricsDialog.ui" line="169"/> <source>#</source> <translation>#</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="203"/> + <location filename="../RawMetricsDialog.ui" line="208"/> <source>%v/%m Files</source> <translation>%v/%m Dateien</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="78"/> - <source><table><tr><td><b>LOC</b></td><td>Lines of code (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Source lines of code</td></tr><tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr><tr><td><b>Comments</b></td><td>Comment lines</td></tr><tr><td><b>Multi</b></td><td>Lines in multi line strings</td></tr><tr><td><b>Empty</b></td><td>Blank lines</td></tr><tr><td colspan=2><b>Comment Statistics:</b></td</tr><tr><td><b>C % L</b></td><td>Comments to lines ratio</td></tr><tr><td><b>C % S</b></td><td>Comments to source lines ratio</td></tr><tr><td><b>C + M % L</b></td><td>Comments plus multi line strings to lines ratio</td></tr></table></source> - <translation><table><tr><td><b>LOC</b></td><td>Textzeilen (LOC = SLOC + Leerzeilen)</td></tr><tr><td><b>SLOC</b></td><td>Quelltextzeilen</td></tr><tr><td><b>LLOC</b></td><td>Logische Quelltextzeilen</td></tr><tr><td><b>Kommentare</b></td><td>Kommentarzeilen</td></tr><tr><td><b>Mehrfach</b></td><td>Zeilen in mehrzeiligen Zeichenketten</td></tr><tr><td><b>Leer</b></td><td>Leerzeilen</td></tr><tr><td colspan=2><b>Kommentarstatistiken:</b></td</tr><tr><td><b>K % L</b></td><td>Verhältnis Kommentare zu Textzeilen</td></tr><tr><td><b>K % S</b></td><td>Verhältnis Kommentare zu Quelltextzeilen</td></tr><tr><td><b>K + M % L</b></td><td>Verhältnis der Summe aus Kommentaren und mehrzeiliger Zeichenketten zu Textzeilen</td></tr></table></translation> - </message> - <message> - <location filename="../RawMetricsDialog.py" line="141"/> + <location filename="../RawMetricsDialog.py" line="143"/> <source>Errors</source> <translation>Fehler</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="282"/> + <location filename="../RawMetricsDialog.py" line="285"/> <source>Preparing files...</source> <translation>Bereite Dateien vor...</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="423"/> + <location filename="../RawMetricsDialog.py" line="427"/> <source>Files</source> <translation>Dateien</translation> </message> @@ -403,24 +398,34 @@ <translation>Drücke, um die Berechnung zu starten</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="194"/> + <location filename="../RawMetricsDialog.ui" line="199"/> <source>Shows the progress of the calculation</source> <translation>Zeigt den Fortschritt der Berechnung</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="431"/> + <location filename="../RawMetricsDialog.py" line="435"/> <source>Comment Lines</source> <translation>Kommentarzeilen</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="434"/> + <location filename="../RawMetricsDialog.py" line="441"/> <source>Multiline Strings</source> <translation>Mehrzeiligen Zeichenketten</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="437"/> + <location filename="../RawMetricsDialog.py" line="444"/> <source>Empty Lines</source> <translation>Leerzeilen</translation> </message> + <message> + <location filename="../RawMetricsDialog.py" line="438"/> + <source>Empty Comments</source> + <translation>Leere Kommentare</translation> + </message> + <message> + <location filename="../RawMetricsDialog.py" line="78"/> + <source><table><tr><td><b>LOC</b></td><td>Lines of code (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Source lines of code</td></tr><tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr><tr><td><b>Comments</b></td><td>Comment lines</td></tr><tr><td><b>Empty&nbsp;Comments</b></td><td>Comment lines not containing code</td></tr><tr><td><b>Multi</b></td><td>Lines in multi line strings</td></tr><tr><td><b>Empty</b></td><td>Blank lines</td></tr><tr><td colspan=2><b>Comment Statistics:</b></td</tr><tr><td><b>C % L</b></td><td>Comments to lines ratio</td></tr><tr><td><b>C % S</b></td><td>Comments to source lines ratio</td></tr><tr><td><b>C + M % L</b></td><td>Comments plus multi line strings to lines ratio</td></tr></table></source> + <translation><table><tr><td><b>LOC</b></td><td>Textzeilen (LOC = SLOC + Leerzeilen)</td></tr><tr><td><b>SLOC</b></td><td>Quelltextzeilen</td></tr><tr><td><b>LLOC</b></td><td>Logische Quelltextzeilen</td></tr><tr><td><b>Kommentare</b></td><td>Kommentarzeilen</td></tr><tr><b>Leere&nbsp;Kommentare</b></td><td>Kommentarzeilen ohne Inhalt</td></tr><tr><td><b>Mehrfach</b></td><td>Zeilen in mehrzeiligen Zeichenketten</td></tr><tr><td><b>Leer</b></td><td>Leerzeilen</td></tr><tr><td colspan=2><b>Kommentarstatistiken:</b></td</tr><tr><td><b>K % L</b></td><td>Verhältnis Kommentare zu Textzeilen</td></tr><tr><td><b>K % S</b></td><td>Verhältnis Kommentare zu Quelltextzeilen</td></tr><tr><td><b>K + M % L</b></td><td>Verhältnis der Summe aus Kommentaren und mehrzeiliger Zeichenketten zu Textzeilen</td></tr></table></translation> + </message> </context> </TS>
--- a/RadonMetrics/i18n/radon_en.ts Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/i18n/radon_en.ts Sun Nov 25 18:32:27 2018 +0100 @@ -14,102 +14,102 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="62"/> + <location filename="../CyclomaticComplexityDialog.ui" line="83"/> <source>Exclude Files:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="69"/> + <location filename="../CyclomaticComplexityDialog.ui" line="90"/> <source>Enter filename patterns of files to be excluded separated by a comma</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="89"/> + <location filename="../CyclomaticComplexityDialog.ui" line="110"/> <source>Start</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="106"/> + <location filename="../CyclomaticComplexityDialog.ui" line="129"/> <source>Type</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="111"/> + <location filename="../CyclomaticComplexityDialog.ui" line="134"/> <source>Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="116"/> + <location filename="../CyclomaticComplexityDialog.ui" line="139"/> <source>Complexity</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="121"/> + <location filename="../CyclomaticComplexityDialog.ui" line="144"/> <source>Rank</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="196"/> + <location filename="../CyclomaticComplexityDialog.ui" line="219"/> <source>%v/%m Files</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="82"/> + <location filename="../CyclomaticComplexityDialog.py" line="85"/> <source><table><tr><td colspan=3><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>1 - 5</td><td>(low risk - simple block)</td></tr><tr><td><b>B</b></td><td>6 - 10</td><td>(low risk - well structured and stable block)</td></tr><tr><td><b>C</b></td><td>11 - 20</td><td>(moderate risk - slightly complex block)</td></tr><tr><td><b>D</b></td><td>21 - 30</td><td>(more than moderate risk - more complex block)</td></tr><tr><td><b>E</b></td><td>31 - 40</td><td>(high risk - complex block, alarming)</td></tr><tr><td><b>F</b></td><td>&gt; 40</td><td>(very high risk - error-prone, unstable block)</td></tr></table></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="99"/> + <location filename="../CyclomaticComplexityDialog.py" line="102"/> <source><table><tr><td colspan=2><b>Type:</b></td></tr><tr><td><b>C</b></td><td>Class</td></tr><tr><td><b>F</b></td><td>Function</td></tr><tr><td><b>M</b></td><td>Method</td></tr></table></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="203"/> + <location filename="../CyclomaticComplexityDialog.py" line="206"/> <source>Errors</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="361"/> + <location filename="../CyclomaticComplexityDialog.py" line="367"/> <source>Preparing files...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="86"/> + <location filename="../CyclomaticComplexityDialog.ui" line="107"/> <source>Press to start the calculation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="126"/> + <location filename="../CyclomaticComplexityDialog.ui" line="149"/> <source>Begin</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="187"/> + <location filename="../CyclomaticComplexityDialog.ui" line="210"/> <source>Shows the progress of the calculation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="128"/> + <location filename="../CyclomaticComplexityDialog.py" line="131"/> <source>Collapse all</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="130"/> + <location filename="../CyclomaticComplexityDialog.py" line="133"/> <source>Expand all</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="48"/> + <location filename="../CyclomaticComplexityDialog.ui" line="29"/> <source>Minimum Rank:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="55"/> + <location filename="../CyclomaticComplexityDialog.ui" line="36"/> <source>Select the minimum rank of items to be shown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="490"/> + <location filename="../CyclomaticComplexityDialog.py" line="497"/> <source><b>Summary:</b><br/>{0} blocks (classes, functions, methods) analyzed.<br/>Average complexity: {7} ({8})<table><tr><td width=30><b>A</b></td><td align='right'>{1} blocks</td></tr><tr><td width=30><b>B</b></td><td align='right'>{2} blocks</td></tr><tr><td width=30><b>C</b></td><td align='right'>{3} blocks</td></tr><tr><td width=30><b>D</b></td><td align='right'>{4} blocks</td></tr><tr><td width=30><b>E</b></td><td align='right'>{5} blocks</td></tr><tr><td width=30><b>F</b></td><td align='right'>{6} blocks</td></tr></table></source> <translation type="unfinished"></translation> </message> @@ -157,17 +157,12 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="73"/> - <source><table><tr><td colspan=2><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>score &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; score &le; 19</td></tr><tr><td><b>C</b></td><td>score &le; 9</td></tr></table></source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../MaintainabilityIndexDialog.py" line="130"/> + <location filename="../MaintainabilityIndexDialog.py" line="131"/> <source>Errors</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="274"/> + <location filename="../MaintainabilityIndexDialog.py" line="275"/> <source>Preparing files...</source> <translation type="unfinished"></translation> </message> @@ -188,10 +183,15 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="386"/> + <location filename="../MaintainabilityIndexDialog.py" line="387"/> <source><table><tr><td colspan=2><b>Summary:</b></td></tr><tr><td><b>A</b></td><td align='right'>{0} files</td></tr><tr><td><b>B</b></td><td align='right'>{1} files</td></tr><tr><td><b>C</b></td><td align='right'>{2} files</td></tr></table></source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../MaintainabilityIndexDialog.py" line="73"/> + <source><table><tr><td><b>Rank</b></td><td><b>MI Score</b></td><td><b>Maintainability</b></td></tr><tr><td><b>A</b></td><td>100 - 20</td><td>very high</td></tr><tr><td><b>B</b></td><td>19 - 10</td><td>medium</td></tr><tr><td><b>C</b></td><td>9 - 0</td><td>extremely low</td></tr></table></source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>RadonMetricsPlugin</name> @@ -211,7 +211,7 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../PluginMetricsRadon.py" line="1035"/> + <location filename="../../PluginMetricsRadon.py" line="1051"/> <source>Radon</source> <translation type="unfinished"></translation> </message> @@ -276,7 +276,7 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../PluginMetricsRadon.py" line="1035"/> + <location filename="../../PluginMetricsRadon.py" line="1051"/> <source><p><b>Radon Version {0}</b></p><p>Radon is a Python tool that computes various metrics from the source code. Radon can compute:<ul><li><b>Raw</b> metrics (these include SLOC, comment lines, blank lines, multi line strings, ...)</li><li><b>Maintainability Index</b> (the one used in Visual Studio)</li><li><b>McCabe's complexity</b>, i.e. cyclomatic complexity</li></ul></p></source> <translation type="unfinished"></translation> </message> @@ -315,17 +315,17 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="425"/> + <location filename="../RawMetricsDialog.py" line="429"/> <source>LOC</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="427"/> + <location filename="../RawMetricsDialog.py" line="431"/> <source>SLOC</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="429"/> + <location filename="../RawMetricsDialog.py" line="433"/> <source>LLOC</source> <translation type="unfinished"></translation> </message> @@ -335,62 +335,57 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="114"/> + <location filename="../RawMetricsDialog.ui" line="119"/> <source>Multi</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="119"/> - <source>Empty</source> - <translation type="unfinished"></translation> - </message> - <message> <location filename="../RawMetricsDialog.ui" line="124"/> - <source>C % L</source> + <source>Empty</source> <translation type="unfinished"></translation> </message> <message> <location filename="../RawMetricsDialog.ui" line="129"/> + <source>C % L</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../RawMetricsDialog.ui" line="134"/> <source>C % S</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="134"/> + <location filename="../RawMetricsDialog.ui" line="139"/> <source>C + M % L</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="159"/> + <location filename="../RawMetricsDialog.ui" line="164"/> <source>Summary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="164"/> + <location filename="../RawMetricsDialog.ui" line="169"/> <source>#</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="203"/> + <location filename="../RawMetricsDialog.ui" line="208"/> <source>%v/%m Files</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="78"/> - <source><table><tr><td><b>LOC</b></td><td>Lines of code (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Source lines of code</td></tr><tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr><tr><td><b>Comments</b></td><td>Comment lines</td></tr><tr><td><b>Multi</b></td><td>Lines in multi line strings</td></tr><tr><td><b>Empty</b></td><td>Blank lines</td></tr><tr><td colspan=2><b>Comment Statistics:</b></td</tr><tr><td><b>C % L</b></td><td>Comments to lines ratio</td></tr><tr><td><b>C % S</b></td><td>Comments to source lines ratio</td></tr><tr><td><b>C + M % L</b></td><td>Comments plus multi line strings to lines ratio</td></tr></table></source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../RawMetricsDialog.py" line="141"/> + <location filename="../RawMetricsDialog.py" line="143"/> <source>Errors</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="282"/> + <location filename="../RawMetricsDialog.py" line="285"/> <source>Preparing files...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="423"/> + <location filename="../RawMetricsDialog.py" line="427"/> <source>Files</source> <translation type="unfinished"></translation> </message> @@ -400,24 +395,34 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="194"/> + <location filename="../RawMetricsDialog.ui" line="199"/> <source>Shows the progress of the calculation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="431"/> + <location filename="../RawMetricsDialog.py" line="435"/> <source>Comment Lines</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="434"/> + <location filename="../RawMetricsDialog.py" line="441"/> <source>Multiline Strings</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="437"/> + <location filename="../RawMetricsDialog.py" line="444"/> <source>Empty Lines</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../RawMetricsDialog.py" line="438"/> + <source>Empty Comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../RawMetricsDialog.py" line="78"/> + <source><table><tr><td><b>LOC</b></td><td>Lines of code (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Source lines of code</td></tr><tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr><tr><td><b>Comments</b></td><td>Comment lines</td></tr><tr><td><b>Empty&nbsp;Comments</b></td><td>Comment lines not containing code</td></tr><tr><td><b>Multi</b></td><td>Lines in multi line strings</td></tr><tr><td><b>Empty</b></td><td>Blank lines</td></tr><tr><td colspan=2><b>Comment Statistics:</b></td</tr><tr><td><b>C % L</b></td><td>Comments to lines ratio</td></tr><tr><td><b>C % S</b></td><td>Comments to source lines ratio</td></tr><tr><td><b>C + M % L</b></td><td>Comments plus multi line strings to lines ratio</td></tr></table></source> + <translation type="unfinished"></translation> + </message> </context> </TS>
--- a/RadonMetrics/i18n/radon_es.ts Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/i18n/radon_es.ts Sun Nov 25 18:32:27 2018 +0100 @@ -15,102 +15,102 @@ <p>Este diálogo muestra la complejidad ciclomática y rango.</p></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="62"/> + <location filename="../CyclomaticComplexityDialog.ui" line="83"/> <source>Exclude Files:</source> <translation>Excluir Archivos:</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="69"/> + <location filename="../CyclomaticComplexityDialog.ui" line="90"/> <source>Enter filename patterns of files to be excluded separated by a comma</source> <translation>Introducir patrones de nombre de archivo para los archivos a ser excluidos, separados por comas</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="89"/> + <location filename="../CyclomaticComplexityDialog.ui" line="110"/> <source>Start</source> <translation>Iniciar</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="106"/> + <location filename="../CyclomaticComplexityDialog.ui" line="129"/> <source>Type</source> <translation>Tipo</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="111"/> + <location filename="../CyclomaticComplexityDialog.ui" line="134"/> <source>Name</source> <translation>Nombre</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="116"/> + <location filename="../CyclomaticComplexityDialog.ui" line="139"/> <source>Complexity</source> <translation>Complejidad</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="121"/> + <location filename="../CyclomaticComplexityDialog.ui" line="144"/> <source>Rank</source> <translation>Rango</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="196"/> + <location filename="../CyclomaticComplexityDialog.ui" line="219"/> <source>%v/%m Files</source> <translation>%v/%m Archivos</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="82"/> + <location filename="../CyclomaticComplexityDialog.py" line="85"/> <source><table><tr><td colspan=3><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>1 - 5</td><td>(low risk - simple block)</td></tr><tr><td><b>B</b></td><td>6 - 10</td><td>(low risk - well structured and stable block)</td></tr><tr><td><b>C</b></td><td>11 - 20</td><td>(moderate risk - slightly complex block)</td></tr><tr><td><b>D</b></td><td>21 - 30</td><td>(more than moderate risk - more complex block)</td></tr><tr><td><b>E</b></td><td>31 - 40</td><td>(high risk - complex block, alarming)</td></tr><tr><td><b>F</b></td><td>&gt; 40</td><td>(very high risk - error-prone, unstable block)</td></tr></table></source> <translation><table><tr><td colspan=3><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>1 - 5</td><td>(riesgo bajo - bloque simple)</td></tr><tr><td><b>B</b></td><td>6 - 10</td><td>(riesgo bajo - bloque estable y bién estructurado)</td></tr><tr><td><b>C</b></td><td>11 - 20</td><td>(riesgo moderado - bloque ligeramente complejo)</td></tr><tr><td><b>D</b></td><td>21 - 30</td><td>(riesgo más que moderado- bloque más complejo)</td></tr><tr><td><b>E</b></td><td>31 - 40</td><td>(riesgo alto- bloque complejo, alarmante)</td></tr><tr><td><b>F</b></td><td>&gt; 40</td><td>(riesgo muy alto, - propenso a errores, bloque inestable)</td></tr></table></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="99"/> + <location filename="../CyclomaticComplexityDialog.py" line="102"/> <source><table><tr><td colspan=2><b>Type:</b></td></tr><tr><td><b>C</b></td><td>Class</td></tr><tr><td><b>F</b></td><td>Function</td></tr><tr><td><b>M</b></td><td>Method</td></tr></table></source> <translation><table><tr><td colspan=2><b>Type:</b></td></tr><tr><td><b>C</b></td><td>Clase</td></tr><tr><td><b>F</b></td><td>Función</td></tr><tr><td><b>M</b></td><td>Método</td></tr></table></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="203"/> + <location filename="../CyclomaticComplexityDialog.py" line="206"/> <source>Errors</source> <translation>Errores</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="361"/> + <location filename="../CyclomaticComplexityDialog.py" line="367"/> <source>Preparing files...</source> <translation>Preparando archivos...</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="86"/> + <location filename="../CyclomaticComplexityDialog.ui" line="107"/> <source>Press to start the calculation</source> <translation>Pulsar para iniciar el cálculo</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="126"/> + <location filename="../CyclomaticComplexityDialog.ui" line="149"/> <source>Begin</source> <translation>Comenzar</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="187"/> + <location filename="../CyclomaticComplexityDialog.ui" line="210"/> <source>Shows the progress of the calculation</source> <translation>Muestra el progreso del cálculo</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="128"/> + <location filename="../CyclomaticComplexityDialog.py" line="131"/> <source>Collapse all</source> <translation>Contraer todos</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="130"/> + <location filename="../CyclomaticComplexityDialog.py" line="133"/> <source>Expand all</source> <translation>Expandir todos</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="48"/> + <location filename="../CyclomaticComplexityDialog.ui" line="29"/> <source>Minimum Rank:</source> <translation>Rango Mínimo:</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="55"/> + <location filename="../CyclomaticComplexityDialog.ui" line="36"/> <source>Select the minimum rank of items to be shown</source> <translation>Seleccionar el rango mínimo para los elementos a mostrar</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="490"/> + <location filename="../CyclomaticComplexityDialog.py" line="497"/> <source><b>Summary:</b><br/>{0} blocks (classes, functions, methods) analyzed.<br/>Average complexity: {7} ({8})<table><tr><td width=30><b>A</b></td><td align='right'>{1} blocks</td></tr><tr><td width=30><b>B</b></td><td align='right'>{2} blocks</td></tr><tr><td width=30><b>C</b></td><td align='right'>{3} blocks</td></tr><tr><td width=30><b>D</b></td><td align='right'>{4} blocks</td></tr><tr><td width=30><b>E</b></td><td align='right'>{5} blocks</td></tr><tr><td width=30><b>F</b></td><td align='right'>{6} blocks</td></tr></table></source> <translation><b>Resumen:</b><br/>{0} bloques (clases, funciones, métodos) analyzed.<br/>Complejidad media: {7} ({8})<table><tr><td width=30><b>A</b></td><td align='right'>{1} bloques</td></tr><tr><td width=30><b>B</b></td><td align='right'>{2} bloques</td></tr><tr><td width=30><b>C</b></td><td align='right'>{3} bloques</td></tr><tr><td width=30><b>D</b></td><td align='right'>{4} bloques</td></tr><tr><td width=30><b>E</b></td><td align='right'>{5} bloques</td></tr><tr><td width=30><b>F</b></td><td align='right'>{6} bloques</td></tr></table></translation> </message> @@ -160,15 +160,15 @@ <message> <location filename="../MaintainabilityIndexDialog.py" line="73"/> <source><table><tr><td colspan=2><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>score &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; score &le; 19</td></tr><tr><td><b>C</b></td><td>score &le; 9</td></tr></table></source> - <translation><table><tr><td colspan=2><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>puntuación &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; puntuación &le; 19</td></tr><tr><td><b>C</b></td><td>puntuación &le; 9</td></tr></table></translation> + <translation type="obsolete"><table><tr><td colspan=2><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>puntuación &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; puntuación &le; 19</td></tr><tr><td><b>C</b></td><td>puntuación &le; 9</td></tr></table></translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="130"/> + <location filename="../MaintainabilityIndexDialog.py" line="131"/> <source>Errors</source> <translation>Errores</translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="274"/> + <location filename="../MaintainabilityIndexDialog.py" line="275"/> <source>Preparing files...</source> <translation>Preparando archivos...</translation> </message> @@ -190,10 +190,15 @@ <p>Este diálogo muestra el índice de mantenimiento y rango.</p></translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="386"/> + <location filename="../MaintainabilityIndexDialog.py" line="387"/> <source><table><tr><td colspan=2><b>Summary:</b></td></tr><tr><td><b>A</b></td><td align='right'>{0} files</td></tr><tr><td><b>B</b></td><td align='right'>{1} files</td></tr><tr><td><b>C</b></td><td align='right'>{2} files</td></tr></table></source> <translation><table><tr><td colspan=2><b>Resumen:</b></td></tr><tr><td><b>A</b></td><td align='right'>{0} archivos</td></tr><tr><td><b>B</b></td><td align='right'>{1} archivos</td></tr><tr><td><b>C</b></td><td align='right'>{2} archivos</td></tr></table></translation> </message> + <message> + <location filename="../MaintainabilityIndexDialog.py" line="73"/> + <source><table><tr><td><b>Rank</b></td><td><b>MI Score</b></td><td><b>Maintainability</b></td></tr><tr><td><b>A</b></td><td>100 - 20</td><td>very high</td></tr><tr><td><b>B</b></td><td>19 - 10</td><td>medium</td></tr><tr><td><b>C</b></td><td>9 - 0</td><td>extremely low</td></tr></table></source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>RadonMetricsPlugin</name> @@ -213,7 +218,7 @@ <translation>Recibido resultado de métricas desconocidas ({0}).</translation> </message> <message> - <location filename="../../PluginMetricsRadon.py" line="1035"/> + <location filename="../../PluginMetricsRadon.py" line="1051"/> <source>Radon</source> <translation>Radon</translation> </message> @@ -278,7 +283,7 @@ <translation><b>Complejidad Ciclomática...</b><p>Calcula la complejidad ciclomática de archivos Python y lo muestra con un ranking.</p></translation> </message> <message> - <location filename="../../PluginMetricsRadon.py" line="1035"/> + <location filename="../../PluginMetricsRadon.py" line="1051"/> <source><p><b>Radon Version {0}</b></p><p>Radon is a Python tool that computes various metrics from the source code. Radon can compute:<ul><li><b>Raw</b> metrics (these include SLOC, comment lines, blank lines, multi line strings, ...)</li><li><b>Maintainability Index</b> (the one used in Visual Studio)</li><li><b>McCabe's complexity</b>, i.e. cyclomatic complexity</li></ul></p></source> <translation><p><b>Radon Versión {0}</b></p><p>Radon es una herramienta de Python que calcula varias métricas a partir del código fuente. Radon puede calcular:<ul><li>Métricas <b>en bruto</b> (incluyen SLOC -líneas de código fuente-, líneas de comentarios, líneas en blanco, cadenas multilínea, ...)</li><li><b>Índice de Mantenibilidad</b> (el que se utiliza en Visual Studio)</li><li><b>complejidad de McCabe</b>, complejidad ciclomática</li></ul></p></translation> </message> @@ -318,17 +323,17 @@ <translation>Nombre</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="425"/> + <location filename="../RawMetricsDialog.py" line="429"/> <source>LOC</source> <translation>LOC</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="427"/> + <location filename="../RawMetricsDialog.py" line="431"/> <source>SLOC</source> <translation>SLOC</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="429"/> + <location filename="../RawMetricsDialog.py" line="433"/> <source>LLOC</source> <translation>LLOC</translation> </message> @@ -338,62 +343,62 @@ <translation>Comentarios</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="114"/> + <location filename="../RawMetricsDialog.ui" line="119"/> <source>Multi</source> <translation>Multi</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="119"/> + <location filename="../RawMetricsDialog.ui" line="124"/> <source>Empty</source> <translation>Vacío</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="124"/> + <location filename="../RawMetricsDialog.ui" line="129"/> <source>C % L</source> <translation>C % L</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="129"/> + <location filename="../RawMetricsDialog.ui" line="134"/> <source>C % S</source> <translation>C % S</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="134"/> + <location filename="../RawMetricsDialog.ui" line="139"/> <source>C + M % L</source> <translation>C + M % L</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="159"/> + <location filename="../RawMetricsDialog.ui" line="164"/> <source>Summary</source> <translation>Resumen</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="164"/> + <location filename="../RawMetricsDialog.ui" line="169"/> <source>#</source> <translation>#</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="203"/> + <location filename="../RawMetricsDialog.ui" line="208"/> <source>%v/%m Files</source> <translation>%v/%m Archivos</translation> </message> <message> <location filename="../RawMetricsDialog.py" line="78"/> <source><table><tr><td><b>LOC</b></td><td>Lines of code (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Source lines of code</td></tr><tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr><tr><td><b>Comments</b></td><td>Comment lines</td></tr><tr><td><b>Multi</b></td><td>Lines in multi line strings</td></tr><tr><td><b>Empty</b></td><td>Blank lines</td></tr><tr><td colspan=2><b>Comment Statistics:</b></td</tr><tr><td><b>C % L</b></td><td>Comments to lines ratio</td></tr><tr><td><b>C % S</b></td><td>Comments to source lines ratio</td></tr><tr><td><b>C + M % L</b></td><td>Comments plus multi line strings to lines ratio</td></tr></table></source> - <translation><table><tr><td><b>LOC</b></td><td>Líneas de código (LOC = SLOC + Vacío)</td></tr><tr><td><b>SLOC</b></td><td>Líneas de código fuente</td></tr><tr><td><b>LLOC</b></td><td>Líneas logicas de código</td></tr><tr><td><b>Comentarios</b></td><td>Líneas de comentarios</td></tr><tr><td><b>Multi</b></td><td>Líneas en cadenas multilínea</td></tr><tr><td><b>Vacío</b></td><td>Líneas en blanco</td></tr><tr><td colspan=2><b>Estadísticas de Comentarios:</b></td</tr><tr><td><b>C % L</b></td><td>Ratio entre comentarios y líneas</td></tr><tr><td><b>C % S</b></td><td>Ratio entre comentarios y líneas de código fuente</td></tr><tr><td><b>C + M % L</b></td><td>Ratio entre comentarios más cadenas multilínea y líneas</td></tr></table></translation> + <translation type="obsolete"><table><tr><td><b>LOC</b></td><td>Líneas de código (LOC = SLOC + Vacío)</td></tr><tr><td><b>SLOC</b></td><td>Líneas de código fuente</td></tr><tr><td><b>LLOC</b></td><td>Líneas logicas de código</td></tr><tr><td><b>Comentarios</b></td><td>Líneas de comentarios</td></tr><tr><td><b>Multi</b></td><td>Líneas en cadenas multilínea</td></tr><tr><td><b>Vacío</b></td><td>Líneas en blanco</td></tr><tr><td colspan=2><b>Estadísticas de Comentarios:</b></td</tr><tr><td><b>C % L</b></td><td>Ratio entre comentarios y líneas</td></tr><tr><td><b>C % S</b></td><td>Ratio entre comentarios y líneas de código fuente</td></tr><tr><td><b>C + M % L</b></td><td>Ratio entre comentarios más cadenas multilínea y líneas</td></tr></table></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="141"/> + <location filename="../RawMetricsDialog.py" line="143"/> <source>Errors</source> <translation>Errores</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="282"/> + <location filename="../RawMetricsDialog.py" line="285"/> <source>Preparing files...</source> <translation>Preparando archivos...</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="423"/> + <location filename="../RawMetricsDialog.py" line="427"/> <source>Files</source> <translation>Archivos</translation> </message> @@ -403,24 +408,34 @@ <translation>Pulsar para iniciar el cálculo</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="194"/> + <location filename="../RawMetricsDialog.ui" line="199"/> <source>Shows the progress of the calculation</source> <translation>Muestra el progreso del cálculo</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="431"/> + <location filename="../RawMetricsDialog.py" line="435"/> <source>Comment Lines</source> <translation>Líneas de Comentarios</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="434"/> + <location filename="../RawMetricsDialog.py" line="441"/> <source>Multiline Strings</source> <translation>Cadenas Multilínea</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="437"/> + <location filename="../RawMetricsDialog.py" line="444"/> <source>Empty Lines</source> <translation>Líneas en Blanco</translation> </message> + <message> + <location filename="../RawMetricsDialog.py" line="438"/> + <source>Empty Comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../RawMetricsDialog.py" line="78"/> + <source><table><tr><td><b>LOC</b></td><td>Lines of code (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Source lines of code</td></tr><tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr><tr><td><b>Comments</b></td><td>Comment lines</td></tr><tr><td><b>Empty&nbsp;Comments</b></td><td>Comment lines not containing code</td></tr><tr><td><b>Multi</b></td><td>Lines in multi line strings</td></tr><tr><td><b>Empty</b></td><td>Blank lines</td></tr><tr><td colspan=2><b>Comment Statistics:</b></td</tr><tr><td><b>C % L</b></td><td>Comments to lines ratio</td></tr><tr><td><b>C % S</b></td><td>Comments to source lines ratio</td></tr><tr><td><b>C + M % L</b></td><td>Comments plus multi line strings to lines ratio</td></tr></table></source> + <translation type="unfinished"></translation> + </message> </context> </TS>
--- a/RadonMetrics/i18n/radon_ru.ts Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/i18n/radon_ru.ts Sun Nov 25 18:32:27 2018 +0100 @@ -15,102 +15,102 @@ <p>Данный диалог отображает цикломатическую сложность и ее уровень.</p></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="62"/> + <location filename="../CyclomaticComplexityDialog.ui" line="83"/> <source>Exclude Files:</source> <translation>Исключить файлы:</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="69"/> + <location filename="../CyclomaticComplexityDialog.ui" line="90"/> <source>Enter filename patterns of files to be excluded separated by a comma</source> <translation>Введите шаблоны имен для исключаемых файлов, разделенные запятыми</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="89"/> + <location filename="../CyclomaticComplexityDialog.ui" line="110"/> <source>Start</source> <translation>Старт</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="106"/> + <location filename="../CyclomaticComplexityDialog.ui" line="129"/> <source>Type</source> <translation>Тип</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="111"/> + <location filename="../CyclomaticComplexityDialog.ui" line="134"/> <source>Name</source> <translation>Имя</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="116"/> + <location filename="../CyclomaticComplexityDialog.ui" line="139"/> <source>Complexity</source> <translation>Сложность</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="121"/> + <location filename="../CyclomaticComplexityDialog.ui" line="144"/> <source>Rank</source> <translation>Уровень</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="196"/> + <location filename="../CyclomaticComplexityDialog.ui" line="219"/> <source>%v/%m Files</source> <translation>%v из %m файлов</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="82"/> + <location filename="../CyclomaticComplexityDialog.py" line="85"/> <source><table><tr><td colspan=3><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>1 - 5</td><td>(low risk - simple block)</td></tr><tr><td><b>B</b></td><td>6 - 10</td><td>(low risk - well structured and stable block)</td></tr><tr><td><b>C</b></td><td>11 - 20</td><td>(moderate risk - slightly complex block)</td></tr><tr><td><b>D</b></td><td>21 - 30</td><td>(more than moderate risk - more complex block)</td></tr><tr><td><b>E</b></td><td>31 - 40</td><td>(high risk - complex block, alarming)</td></tr><tr><td><b>F</b></td><td>&gt; 40</td><td>(very high risk - error-prone, unstable block)</td></tr></table></source> <translation><table><tr><td colspan=3><b>Ранжирование:</b></td></tr><tr><td><b>A</b></td><td>1 - 5</td><td>(низкий риск - простой блок)</td></tr><tr><td><b>B</b></td><td>6 - 10</td><td>(низкий риск - хорошо структурированный стабильный блок)</td></tr><tr><td><b>C</b></td><td>11 - 20</td><td>(умеренный риск - немного сложный блок)</td></tr><tr><td><b>D</b></td><td>21 - 30</td><td>(более чем умеренный риск - более сложный блок)</td></tr><tr><td><b>E</b></td><td>31 - 40</td><td>(высокий риск - сложный, аварийный блок)</td></tr><tr><td><b>F</b></td><td>&gt; 40</td><td>(очень высокий риск - нестабильный блок, подвержен ошибкам)</td></tr></table></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="99"/> + <location filename="../CyclomaticComplexityDialog.py" line="102"/> <source><table><tr><td colspan=2><b>Type:</b></td></tr><tr><td><b>C</b></td><td>Class</td></tr><tr><td><b>F</b></td><td>Function</td></tr><tr><td><b>M</b></td><td>Method</td></tr></table></source> <translation><table><tr><td colspan=2><b>Тип:</b></td></tr><tr><td><b>C</b></td><td>Класс</td></tr><tr><td><b>F</b></td><td>Функция</td></tr><tr><td><b>M</b></td><td>Метод</td></tr></table></translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="203"/> + <location filename="../CyclomaticComplexityDialog.py" line="206"/> <source>Errors</source> <translation>Ошибки</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="361"/> + <location filename="../CyclomaticComplexityDialog.py" line="367"/> <source>Preparing files...</source> <translation>Подготовка файлов...</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="86"/> + <location filename="../CyclomaticComplexityDialog.ui" line="107"/> <source>Press to start the calculation</source> <translation>Выполнить оценку кода</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="126"/> + <location filename="../CyclomaticComplexityDialog.ui" line="149"/> <source>Begin</source> <translation>Начальная строка блока</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="187"/> + <location filename="../CyclomaticComplexityDialog.ui" line="210"/> <source>Shows the progress of the calculation</source> <translation>Отображение процесса выполнения оценки</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="128"/> + <location filename="../CyclomaticComplexityDialog.py" line="131"/> <source>Collapse all</source> <translation>Свернуть все</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="130"/> + <location filename="../CyclomaticComplexityDialog.py" line="133"/> <source>Expand all</source> <translation>Развернуть все</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="48"/> + <location filename="../CyclomaticComplexityDialog.ui" line="29"/> <source>Minimum Rank:</source> <translation>Мин. уровень:</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.ui" line="55"/> + <location filename="../CyclomaticComplexityDialog.ui" line="36"/> <source>Select the minimum rank of items to be shown</source> <translation>Выбор минимального уровня сложности для отображения</translation> </message> <message> - <location filename="../CyclomaticComplexityDialog.py" line="490"/> + <location filename="../CyclomaticComplexityDialog.py" line="497"/> <source><b>Summary:</b><br/>{0} blocks (classes, functions, methods) analyzed.<br/>Average complexity: {7} ({8})<table><tr><td width=30><b>A</b></td><td align='right'>{1} blocks</td></tr><tr><td width=30><b>B</b></td><td align='right'>{2} blocks</td></tr><tr><td width=30><b>C</b></td><td align='right'>{3} blocks</td></tr><tr><td width=30><b>D</b></td><td align='right'>{4} blocks</td></tr><tr><td width=30><b>E</b></td><td align='right'>{5} blocks</td></tr><tr><td width=30><b>F</b></td><td align='right'>{6} blocks</td></tr></table></source> <translation><b>Сводка:</b><br/>{0} блоков (классов, функций, методов) проанализировано.<br/>Средняя сложность: {7} ({8})<table><tr><td width=30><b>A</b></td><td align='right'>{1} блоков</td></tr><tr><td width=30><b>B</b></td><td align='right'>{2} блоков</td></tr><tr><td width=30><b>C</b></td><td align='right'>{3} блоков</td></tr><tr><td width=30><b>D</b></td><td align='right'>{4} блоков</td></tr><tr><td width=30><b>E</b></td><td align='right'>{5} блоков</td></tr><tr><td width=30><b>F</b></td><td align='right'>{6} блоков</td></tr></table></translation> </message> @@ -160,15 +160,15 @@ <message> <location filename="../MaintainabilityIndexDialog.py" line="73"/> <source><table><tr><td colspan=2><b>Ranking:</b></td></tr><tr><td><b>A</b></td><td>score &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; score &le; 19</td></tr><tr><td><b>C</b></td><td>score &le; 9</td></tr></table></source> - <translation><table><tr><td colspan=2><b>Ранжирование:</b></td></tr><tr><td><b>A</b></td><td>баллы &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; баллы &le; 19</td></tr><tr><td><b>C</b></td><td>баллы &le; 9</td></tr></table></translation> + <translation type="obsolete"><table><tr><td colspan=2><b>Ранжирование:</b></td></tr><tr><td><b>A</b></td><td>баллы &gt; 19</td></tr><tr><td><b>B</b></td><td>9 &lt; баллы &le; 19</td></tr><tr><td><b>C</b></td><td>баллы &le; 9</td></tr></table></translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="130"/> + <location filename="../MaintainabilityIndexDialog.py" line="131"/> <source>Errors</source> <translation>Ошибки</translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="274"/> + <location filename="../MaintainabilityIndexDialog.py" line="275"/> <source>Preparing files...</source> <translation>Подготовка файлов...</translation> </message> @@ -190,10 +190,15 @@ <p>Данный диалог отображает индекс сложности поддержки и его уровень.</p></translation> </message> <message> - <location filename="../MaintainabilityIndexDialog.py" line="386"/> + <location filename="../MaintainabilityIndexDialog.py" line="387"/> <source><table><tr><td colspan=2><b>Summary:</b></td></tr><tr><td><b>A</b></td><td align='right'>{0} files</td></tr><tr><td><b>B</b></td><td align='right'>{1} files</td></tr><tr><td><b>C</b></td><td align='right'>{2} files</td></tr></table></source> <translation><table><tr><td colspan=2><b>Сводка:</b></td></tr><tr><td><b>A</b></td><td align='right'>{0} файлов</td></tr><tr><td><b>B</b></td><td align='right'>{1} файлов</td></tr><tr><td><b>C</b></td><td align='right'>{2} файлов</td></tr></table></translation> </message> + <message> + <location filename="../MaintainabilityIndexDialog.py" line="73"/> + <source><table><tr><td><b>Rank</b></td><td><b>MI Score</b></td><td><b>Maintainability</b></td></tr><tr><td><b>A</b></td><td>100 - 20</td><td>very high</td></tr><tr><td><b>B</b></td><td>19 - 10</td><td>medium</td></tr><tr><td><b>C</b></td><td>9 - 0</td><td>extremely low</td></tr></table></source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>RadonMetricsPlugin</name> @@ -213,7 +218,7 @@ <translation>Получено ({0}) оценок неизвестной метрики.</translation> </message> <message> - <location filename="../../PluginMetricsRadon.py" line="1035"/> + <location filename="../../PluginMetricsRadon.py" line="1051"/> <source>Radon</source> <translation>Radon</translation> </message> @@ -278,7 +283,7 @@ <translation><b>Цикломатическая сложность...</b><p>Вычисляет цикломатическую сложность файлов Python и показывает ее уровень.</p></translation> </message> <message> - <location filename="../../PluginMetricsRadon.py" line="1035"/> + <location filename="../../PluginMetricsRadon.py" line="1051"/> <source><p><b>Radon Version {0}</b></p><p>Radon is a Python tool that computes various metrics from the source code. Radon can compute:<ul><li><b>Raw</b> metrics (these include SLOC, comment lines, blank lines, multi line strings, ...)</li><li><b>Maintainability Index</b> (the one used in Visual Studio)</li><li><b>McCabe's complexity</b>, i.e. cyclomatic complexity</li></ul></p></source> <translation><p><b>Версия Radon {0}</b></p><p>Radon является инструментом Python, позволяющим вычислять различные метрики исходного кода. Radon позволяет оценить:<ul><li><b>Raw</b> метрики (к их числу относятся SLOC, строки коментариев, пустые строки, многострочный текст, ...)</li><li><b>Индекс сложности поддержки (качества кода)</b> (применяется в Visual Studio)</li><li><b>Мак-Кейба сложность</b>, то есть цикломатическая сложность</li></ul></p></translation> </message> @@ -318,17 +323,17 @@ <translation>Имя файла</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="425"/> + <location filename="../RawMetricsDialog.py" line="429"/> <source>LOC</source> <translation>LOC</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="427"/> + <location filename="../RawMetricsDialog.py" line="431"/> <source>SLOC</source> <translation>SLOC</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="429"/> + <location filename="../RawMetricsDialog.py" line="433"/> <source>LLOC</source> <translation>LLOC</translation> </message> @@ -338,62 +343,62 @@ <translation>Comments</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="114"/> + <location filename="../RawMetricsDialog.ui" line="119"/> <source>Multi</source> <translation>Multi</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="119"/> + <location filename="../RawMetricsDialog.ui" line="124"/> <source>Empty</source> <translation>Empty</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="124"/> + <location filename="../RawMetricsDialog.ui" line="129"/> <source>C % L</source> <translation>C % L</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="129"/> + <location filename="../RawMetricsDialog.ui" line="134"/> <source>C % S</source> <translation>C % S</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="134"/> + <location filename="../RawMetricsDialog.ui" line="139"/> <source>C + M % L</source> <translation>C + M % L</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="159"/> + <location filename="../RawMetricsDialog.ui" line="164"/> <source>Summary</source> <translation>Итого</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="164"/> + <location filename="../RawMetricsDialog.ui" line="169"/> <source>#</source> <translation>#</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="203"/> + <location filename="../RawMetricsDialog.ui" line="208"/> <source>%v/%m Files</source> <translation>%v из %m файлов</translation> </message> <message> <location filename="../RawMetricsDialog.py" line="78"/> <source><table><tr><td><b>LOC</b></td><td>Lines of code (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Source lines of code</td></tr><tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr><tr><td><b>Comments</b></td><td>Comment lines</td></tr><tr><td><b>Multi</b></td><td>Lines in multi line strings</td></tr><tr><td><b>Empty</b></td><td>Blank lines</td></tr><tr><td colspan=2><b>Comment Statistics:</b></td</tr><tr><td><b>C % L</b></td><td>Comments to lines ratio</td></tr><tr><td><b>C % S</b></td><td>Comments to source lines ratio</td></tr><tr><td><b>C + M % L</b></td><td>Comments plus multi line strings to lines ratio</td></tr></table></source> - <translation><table><tr><td><b>LOC</b></td><td>Количество строк кода (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Количество исходных строк кода</td></tr><tr><td><b>LLOC</b></td><td>Количество логических строк кода</td></tr><tr><td><b>Comments</b></td><td>Количество строк комментариев</td></tr><tr><td><b>Multi</b></td><td>Количество строк многострочного текста</td></tr><tr><td><b>Empty</b></td><td>Количество пустых строк</td></tr><tr><td colspan=2><b>Статистика коментариев:</b></td</tr><tr><td><b>C % L</b></td><td>Процент строк комментариев к общему числу строк</td></tr><tr><td><b>C % S</b></td><td>Процент строк комментариев к числу строк исходного кода</td></tr><tr><td><b>C + M % L</b></td><td>Процент строк комментариев + многострочного текста к общему числу строк</td></tr></table></translation> + <translation type="obsolete"><table><tr><td><b>LOC</b></td><td>Количество строк кода (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Количество исходных строк кода</td></tr><tr><td><b>LLOC</b></td><td>Количество логических строк кода</td></tr><tr><td><b>Comments</b></td><td>Количество строк комментариев</td></tr><tr><td><b>Multi</b></td><td>Количество строк многострочного текста</td></tr><tr><td><b>Empty</b></td><td>Количество пустых строк</td></tr><tr><td colspan=2><b>Статистика коментариев:</b></td</tr><tr><td><b>C % L</b></td><td>Процент строк комментариев к общему числу строк</td></tr><tr><td><b>C % S</b></td><td>Процент строк комментариев к числу строк исходного кода</td></tr><tr><td><b>C + M % L</b></td><td>Процент строк комментариев + многострочного текста к общему числу строк</td></tr></table></translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="141"/> + <location filename="../RawMetricsDialog.py" line="143"/> <source>Errors</source> <translation>Ошибки</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="282"/> + <location filename="../RawMetricsDialog.py" line="285"/> <source>Preparing files...</source> <translation>Подготовка файлов...</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="423"/> + <location filename="../RawMetricsDialog.py" line="427"/> <source>Files</source> <translation>Файлы</translation> </message> @@ -403,24 +408,34 @@ <translation>Выполнить оценку кода</translation> </message> <message> - <location filename="../RawMetricsDialog.ui" line="194"/> + <location filename="../RawMetricsDialog.ui" line="199"/> <source>Shows the progress of the calculation</source> <translation>Отображение процесса выполнения оценки</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="431"/> + <location filename="../RawMetricsDialog.py" line="435"/> <source>Comment Lines</source> <translation>Comment Lines</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="434"/> + <location filename="../RawMetricsDialog.py" line="441"/> <source>Multiline Strings</source> <translation>Multiline Strings</translation> </message> <message> - <location filename="../RawMetricsDialog.py" line="437"/> + <location filename="../RawMetricsDialog.py" line="444"/> <source>Empty Lines</source> <translation>Empty Lines</translation> </message> + <message> + <location filename="../RawMetricsDialog.py" line="438"/> + <source>Empty Comments</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../RawMetricsDialog.py" line="78"/> + <source><table><tr><td><b>LOC</b></td><td>Lines of code (LOC = SLOC + Empty)</td></tr><tr><td><b>SLOC</b></td><td>Source lines of code</td></tr><tr><td><b>LLOC</b></td><td>Logical lines of code</td></tr><tr><td><b>Comments</b></td><td>Comment lines</td></tr><tr><td><b>Empty&nbsp;Comments</b></td><td>Comment lines not containing code</td></tr><tr><td><b>Multi</b></td><td>Lines in multi line strings</td></tr><tr><td><b>Empty</b></td><td>Blank lines</td></tr><tr><td colspan=2><b>Comment Statistics:</b></td</tr><tr><td><b>C % L</b></td><td>Comments to lines ratio</td></tr><tr><td><b>C % S</b></td><td>Comments to source lines ratio</td></tr><tr><td><b>C + M % L</b></td><td>Comments plus multi line strings to lines ratio</td></tr></table></source> + <translation type="unfinished"></translation> + </message> </context> </TS>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RadonMetrics/radon/LICENSE Sun Nov 25 18:32:27 2018 +0100 @@ -0,0 +1,22 @@ +Copyright (c) 2012-2017 Michele Lacchia + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE.
--- a/RadonMetrics/radon/__init__.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/radon/__init__.py Sun Nov 25 18:32:27 2018 +0100 @@ -1,5 +1,21 @@ -""" -This module contains the version info. -""" +'''This module contains the main() function, which is the entry point for the +command line interface.''' + +__version__ = '2.4.0' + + +def main(): + '''The entry point for Setuptools.''' + import sys + from radon.cli import program, log_error -__version__ = '1.2.2' + if not sys.argv[1:]: + sys.argv.append('-h') + try: + program() + except Exception as e: + log_error(e) + + +if __name__ == '__main__': + main()
--- a/RadonMetrics/radon/complexity.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/radon/complexity.py Sun Nov 25 18:32:27 2018 +0100 @@ -2,6 +2,13 @@ Cyclomatic Complexity ''' +# +# Patched for use within eric6 +# Removed the Flake8Checker related code +# +# Modifications Copyright (c) 2018 Detlev Offenbach <detlev@die-offenbachs.de> +# + import math from radon.visitors import GET_COMPLEXITY, ComplexityVisitor, code2ast @@ -73,16 +80,22 @@ return sorted(blocks, key=order) -def add_closures(blocks): - '''Process a list of blocks by adding all closures as top-level blocks.''' +def add_inner_blocks(blocks): + '''Process a list of blocks by adding all closures and inner classes as + top-level blocks. + ''' new_blocks = [] - for block in blocks: + all_blocks = blocks[:] + while all_blocks: + block = all_blocks.pop() new_blocks.append(block) - if 'closures' not in block._fields: - continue - for closure in block.closures: - named = closure._replace(name=block.name + '.' + closure.name) - new_blocks.append(named) + for inner_block in ('closures', 'inner_classes'): + for i_block in getattr(block, inner_block, ()): + named = i_block._replace(name=block.name + '.' + i_block.name) + all_blocks.append(named) + for meth in getattr(named, 'methods', ()): + m_named = meth._replace(classname=named.name) + all_blocks.append(m_named) return new_blocks @@ -98,49 +111,3 @@ the keyword arguments are directly passed to the visitor. ''' return ComplexityVisitor.from_ast(ast_node, **kwargs).blocks - - -class Flake8Checker(object): - '''Entry point for the Flake8 tool.''' - - name = 'radon' - _code = 'R701' - _error_tmpl = 'R701: %r is too complex (%d)' - no_assert = False - max_cc = -1 - - def __init__(self, tree, filename): - '''Accept the AST tree and a filename (unused).''' - self.tree = tree - - version = property(lambda self: __import__('radon').__version__) - - @classmethod - def add_options(cls, parser): # pragma: no cover - '''Add custom options to the global parser.''' - parser.add_option('--radon-max-cc', default=-1, action='store', - type='int', help='Radon complexity threshold') - parser.add_option('--radon-no-assert', dest='no_assert', - action='store_true', default=False, - help='Radon will ignore assert statements') - parser.config_options.append('radon-max-cc') - parser.config_options.append('radon-no-assert') - - @classmethod - def parse_options(cls, options): # pragma: no cover - '''Save actual options as class attributes.''' - cls.max_cc = options.radon_max_cc - cls.no_assert = options.no_assert - - def run(self): - '''Run the ComplexityVisitor over the AST tree.''' - if self.max_cc < 0: - if not self.no_assert: - return - self.max_cc = 10 - visitor = ComplexityVisitor.from_ast(self.tree, - no_assert=self.no_assert) - for block in visitor.blocks: - if block.complexity > self.max_cc: - text = self._error_tmpl % (block.name, block.complexity) - yield block.lineno, 0, text, type(self)
--- a/RadonMetrics/radon/metrics.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/radon/metrics.py Sun Nov 25 18:32:27 2018 +0100 @@ -10,9 +10,13 @@ # Halstead metrics -Halstead = collections.namedtuple('Halstead', 'h1 h2 N1 N2 vocabulary length ' - 'calculated_length volume ' - 'difficulty effort time bugs') +HalsteadReport = collections.namedtuple('HalsteadReport', 'h1 h2 N1 N2 vocabulary length ' + 'calculated_length volume ' + 'difficulty effort time bugs') + +# `total` is a HalsteadReport for the entire scanned file, while `functions` is +# a list of `HalsteadReport`s for each function in the file. +Halstead = collections.namedtuple("Halstead", "total functions") def h_visit(code): @@ -23,8 +27,10 @@ def h_visit_ast(ast_node): - '''Visit the AST node using the :class:`~radon.visitors.HalsteadVisitor` - visitor. A namedtuple with the following fields is returned: + ''' + Visit the AST node using the :class:`~radon.visitors.HalsteadVisitor` + visitor. The results are `HalsteadReport` namedtuples with the following + fields: * h1: the number of distinct operators * h2: the number of distinct operands @@ -38,8 +44,24 @@ * effort: E = D * V * time: T = E / 18 seconds * bugs: B = V / 3000 - an estimate of the errors in the implementation + + The actual return of this function is a namedtuple with the following + fields: + + * total: a `HalsteadReport` namedtuple for the entire scanned file + * functions: a list of `HalsteadReport`s for each toplevel function + + Nested functions are not tracked. ''' visitor = HalsteadVisitor.from_ast(ast_node) + total = halstead_visitor_report(visitor) + functions = [(v.context, halstead_visitor_report(v)) for v in visitor.function_visitors] + + return Halstead(total, functions) + + +def halstead_visitor_report(visitor): + """Return a HalsteadReport from a HalsteadVisitor instance.""" h1, h2 = visitor.distinct_operators, visitor.distinct_operands N1, N2 = visitor.operators, visitor.operands h = h1 + h2 @@ -51,7 +73,7 @@ volume = N * math.log(h, 2) if h != 0 else 0 difficulty = (h1 * N2) / float(2 * h2) if h2 != 0 else 0 effort = difficulty * volume - return Halstead( + return HalsteadReport( h1, h2, N1, N2, h, N, length, volume, difficulty, effort, effort / 18., volume / 3000. ) @@ -91,7 +113,7 @@ raw = analyze(code) comments_lines = raw.comments + (raw.multi if count_multi else 0) comments = comments_lines / float(raw.sloc) * 100 if raw.sloc != 0 else 0 - return (h_visit_ast(ast_node).volume, + return (h_visit_ast(ast_node).total.volume, ComplexityVisitor.from_ast(ast_node).total_complexity, raw.lloc, comments)
--- a/RadonMetrics/radon/raw.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/radon/raw.py Sun Nov 25 18:32:27 2018 +0100 @@ -28,15 +28,19 @@ # loc = Lines of Code (total lines) # lloc = Logical Lines of Code # comments = Comments lines +# multi = Multi-line strings (assumed to be docstrings) # blank = Blank lines (or whitespace-only lines) +# single_comments = Single-line comments or docstrings Module = collections.namedtuple('Module', ['loc', 'lloc', 'sloc', - 'comments', 'multi', 'blank']) + 'comments', 'multi', 'blank', + 'single_comments']) def _generate(code): '''Pass the code into `tokenize.generate_tokens` and convert the result into a list. ''' + # tokenize.generate_tokens is an undocumented function accepting text return list(tokenize.generate_tokens(io.StringIO(code).readline)) @@ -79,25 +83,25 @@ shortest tokenization possible. This is done by catching :exc:`tokenize.TokenError` when a multi-line string or statement is encountered. + :returns: tokens, lines ''' - sloc_increment = multi_increment = 0 - try: - tokens = _generate(line) - except tokenize.TokenError: - # A multi-line string or statement has been encountered: - # start adding lines and stop when tokenize stops complaining - while True: - sloc_increment += 1 - line = '\n'.join([line, next(lines)]) - try: - tokens = _generate(line) - except tokenize.TokenError: - continue - if tokens[0][0] == 3 and len(tokens) == 2: - # Multi-line string detected - multi_increment += line.count('\n') + 1 - break - return tokens, sloc_increment, multi_increment + buffer = line + used_lines = [line] + while True: + try: + tokens = _generate(buffer) + except tokenize.TokenError: + # A multi-line string or statement has been encountered: + # start adding lines and stop when tokenize stops complaining + pass + else: + if not any(t[0] == tokenize.ERRORTOKEN for t in tokens): + return tokens, used_lines + + # Add another line + next_line = next(lines) + buffer = buffer + '\n' + next_line + used_lines.append(next_line) def _logical(tokens): @@ -148,6 +152,15 @@ return sum(aux(sub) for sub in _split_tokens(tokens, OP, ';')) +def is_single_token(token_number, tokens): + '''Is this a single token matching token_number followed by ENDMARKER or NL + tokens. + ''' + return (TOKEN_NUMBER(tokens[0]) == token_number and + all(TOKEN_NUMBER(t) in (tokenize.ENDMARKER, tokenize.NL) + for t in tokens[1:])) + + def analyze(source): '''Analyze the source code and return a namedtuple with the following fields: @@ -158,37 +171,58 @@ corresponding to the LLOC) * **comments**: The number of Python comment lines * **multi**: The number of lines which represent multi-line strings + * **single_comments**: The number of lines which are just comments with + no code * **blank**: The number of blank lines (or whitespace-only ones) - The equation :math:`sloc + blanks = loc` should always hold. - Multiline strings are not counted as comments, since, to the Python - interpreter, they are not comments but strings. + The equation :math:`sloc + blanks + multi + single_comments = loc` should + always hold. Multiline strings are not counted as comments, since, to the + Python interpreter, they are not comments but strings. ''' - loc = sloc = lloc = comments = multi = blank = 0 - lines = iter(source.splitlines()) - for lineno, line in enumerate(lines, 1): - loc += 1 - line = line.strip() - if not line: - blank += 1 - continue - # If this is not a blank line, then it counts as a - # source line of code - sloc += 1 + lloc = comments = single_comments = multi = blank = sloc = 0 + lines = (l.strip() for l in source.splitlines()) + lineno = 1 + for line in lines: try: - # Process a logical line that spans on multiple lines - tokens, sloc_incr, multi_incr = _get_all_tokens(line, lines) + # Get a syntactically complete set of tokens that spans a set of + # lines + tokens, parsed_lines = _get_all_tokens(line, lines) except StopIteration: raise SyntaxError('SyntaxError at line: {0}'.format(lineno)) - # Update tracked metrics - loc += sloc_incr # LOC and SLOC increments are the same - sloc += sloc_incr - multi += multi_incr - # Add the comments - comments += list(map(TOKEN_NUMBER, tokens)).count(COMMENT) - # Process a logical line - # Split it on semicolons because they increase the number of logical - # lines - for sub_tokens in _split_tokens(tokens, OP, ';'): - lloc += _logical(sub_tokens) - return Module(loc, lloc, sloc, comments, multi, blank) + + lineno += len(parsed_lines) + + comments += sum(1 for t in tokens + if TOKEN_NUMBER(t) == tokenize.COMMENT) + + # Identify single line comments, conservatively + if is_single_token(tokenize.COMMENT, tokens): + single_comments += 1 + + # Identify docstrings, conservatively + elif is_single_token(tokenize.STRING, tokens): + _, _, (start_row, _), (end_row, _), _ = tokens[0] + if end_row == start_row: + # Consider single-line docstrings separately from other + # multiline docstrings + single_comments += 1 + else: + multi += sum(1 for l in parsed_lines if l) # Skip empty lines + blank += sum(1 for l in parsed_lines if not l) + + else: # Everything else is either code or blank lines + + for parsed_line in parsed_lines: + if parsed_line: + sloc += 1 + else: + blank += 1 + + # Process a logical line + # Split it on semicolons because they increase the number of + # logical lines + for sub_tokens in _split_tokens(tokens, OP, ';'): + lloc += _logical(sub_tokens) + + loc = sloc + blank + multi + single_comments + return Module(loc, lloc, sloc, comments, multi, blank, single_comments)
--- a/RadonMetrics/radon/visitors.py Sat Mar 31 13:05:51 2018 +0200 +++ b/RadonMetrics/radon/visitors.py Sun Nov 25 18:32:27 2018 +0100 @@ -2,10 +2,6 @@ analysis concerning Cyclomatic Complexity is done. There is also the class HalsteadVisitor, that counts Halstead metrics.''' -# -# patched to support Python 3.5 'async def'. -# - import ast import operator import collections @@ -23,17 +19,16 @@ 'complexity']) BaseClass = collections.namedtuple('Class', ['name', 'lineno', 'col_offset', 'endline', 'methods', + 'inner_classes', 'real_complexity']) def code2ast(source): - '''Convert a string object into an AST object. This function attempts to - convert the string into bytes. + '''Convert a string object into an AST object. + + This function is retained for backwards compatibility, but it no longer + attemps any conversions. It's equivalent to a call to ``ast.parse``. ''' - try: - source = source.encode('utf-8') # necessary in Python 3 - except UnicodeDecodeError: # pragma: no cover - pass return ast.parse(source) @@ -211,7 +206,7 @@ self.complexity += len(node.values) - 1 # Ifs, with and assert statements count all as 1. # Note: Lambda functions are not counted anymore, see #68 - elif name in ('With', 'If', 'IfExp', 'AsyncWith'): + elif name in ('With', 'If', 'IfExp', 'AsyncWith'): self.complexity += 1 # The For and While blocks count as 1 plus the `else` block. elif name in ('For', 'While', 'AsyncFor'): @@ -229,6 +224,12 @@ ''' self.complexity += not self.no_assert + def visit_AsyncFunctionDef(self, node): + '''Async function definition is the same thing as the synchronous + one. + ''' + self.visit_FunctionDef(node) + def visit_FunctionDef(self, node): '''When visiting functions a new visitor is created to recursively analyze the function's body. @@ -251,8 +252,6 @@ self.classname, closures, body_complexity) self.functions.append(func) - visit_AsyncFunctionDef = visit_FunctionDef - def visit_ClassDef(self, node): '''When visiting classes a new visitor is created to recursively analyze the class' body and methods. @@ -266,6 +265,7 @@ body_complexity = 1 classname = node.name visitors_max_lines = [node.lineno] + inner_classes = [] for child in node.body: visitor = ComplexityVisitor(True, classname, off=False, no_assert=self.no_assert) @@ -274,10 +274,11 @@ body_complexity += (visitor.complexity + visitor.functions_complexity) visitors_max_lines.append(visitor.max_line) + inner_classes.extend(visitor.classes) cls = Class(classname, node.lineno, node.col_offset, max(visitors_max_lines + list(map(GET_ENDLINE, methods))), - methods, body_complexity) + methods, inner_classes, body_complexity) self.classes.append(cls) @@ -298,6 +299,9 @@ self.operands = 0 self.context = context + # A new visitor is spawned for every scanned function. + self.function_visitors = [] + @property def distinct_operators(self): '''The number of distinct operators.''' @@ -362,8 +366,11 @@ def visit_FunctionDef(self, node): '''When visiting functions, another visitor is created to recursively - analyze the function's body. + analyze the function's body. We also track information on the function + itself. ''' + func_visitor = HalsteadVisitor(context=node.name) + for child in node.body: visitor = HalsteadVisitor.from_ast(child, context=node.name) self.operators += visitor.operators @@ -371,4 +378,10 @@ self.operators_seen.update(visitor.operators_seen) self.operands_seen.update(visitor.operands_seen) - visit_AsyncFunctionDef = visit_FunctionDef + func_visitor.operators += visitor.operators + func_visitor.operands += visitor.operands + func_visitor.operators_seen.update(visitor.operators_seen) + func_visitor.operands_seen.update(visitor.operands_seen) + + # Save the visited function visitor for later reference. + self.function_visitors.append(func_visitor)