Upgraded the embedded Radon library to version 2.4.0. release-2.0.0

Sun, 25 Nov 2018 18:32:27 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 25 Nov 2018 18:32:27 +0100
changeset 55
755bc8e1485a
parent 54
f7a462d6ec26
child 56
78fa70705fcc

Upgraded the embedded Radon library to version 2.4.0.

ChangeLog file | annotate | diff | comparison | revisions
PKGLIST file | annotate | diff | comparison | revisions
PluginMetricsRadon.e4p file | annotate | diff | comparison | revisions
PluginMetricsRadon.py file | annotate | diff | comparison | revisions
PluginMetricsRadon.zip file | annotate | diff | comparison | revisions
RadonMetrics/CyclomaticComplexityCalculator.py file | annotate | diff | comparison | revisions
RadonMetrics/CyclomaticComplexityDialog.py file | annotate | diff | comparison | revisions
RadonMetrics/CyclomaticComplexityDialog.ui file | annotate | diff | comparison | revisions
RadonMetrics/Documentation/source/Plugin_Metrics_Radon.PluginMetricsRadon.html file | annotate | diff | comparison | revisions
RadonMetrics/Documentation/source/Plugin_Metrics_Radon.RadonMetrics.CyclomaticComplexityCalculator.html file | annotate | diff | comparison | revisions
RadonMetrics/Documentation/source/Plugin_Metrics_Radon.RadonMetrics.CyclomaticComplexityDialog.html file | annotate | diff | comparison | revisions
RadonMetrics/MaintainabilityIndexDialog.py file | annotate | diff | comparison | revisions
RadonMetrics/RawMetricsDialog.py file | annotate | diff | comparison | revisions
RadonMetrics/RawMetricsDialog.ui file | annotate | diff | comparison | revisions
RadonMetrics/i18n/radon_de.qm file | annotate | diff | comparison | revisions
RadonMetrics/i18n/radon_de.ts file | annotate | diff | comparison | revisions
RadonMetrics/i18n/radon_en.ts file | annotate | diff | comparison | revisions
RadonMetrics/i18n/radon_es.ts file | annotate | diff | comparison | revisions
RadonMetrics/i18n/radon_ru.ts file | annotate | diff | comparison | revisions
RadonMetrics/radon/LICENSE file | annotate | diff | comparison | revisions
RadonMetrics/radon/__init__.py file | annotate | diff | comparison | revisions
RadonMetrics/radon/complexity.py file | annotate | diff | comparison | revisions
RadonMetrics/radon/metrics.py file | annotate | diff | comparison | revisions
RadonMetrics/radon/raw.py file | annotate | diff | comparison | revisions
RadonMetrics/radon/visitors.py file | annotate | diff | comparison | revisions
--- 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())
     
Binary file PluginMetricsRadon.zip has changed
--- 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 &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>"
+            "<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&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>"
@@ -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>
Binary file RadonMetrics/i18n/radon_de.qm has changed
--- 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 @@
 &lt;p&gt;Dieser Dialog zeigt die zyklomatische Komplexität und eine Bewertung.&lt;/p&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td colspan=3&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;1 - 5&lt;/td&gt;&lt;td&gt;(low risk - simple block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;6 - 10&lt;/td&gt;&lt;td&gt;(low risk - well structured and stable block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;11 - 20&lt;/td&gt;&lt;td&gt;(moderate risk - slightly complex block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;21 - 30&lt;/td&gt;&lt;td&gt;(more than moderate risk - more complex block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;31 - 40&lt;/td&gt;&lt;td&gt;(high risk - complex block, alarming)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&amp;gt; 40&lt;/td&gt;&lt;td&gt;(very high risk - error-prone, unstable block)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=3&gt;&lt;b&gt;Bewertung:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;1 - 5&lt;/td&gt;&lt;td&gt;(geringes Risiko - einfacher Block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;6 - 10&lt;/td&gt;&lt;td&gt;(geringes Risika - gut strukturierter und stabiler Block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;11 - 20&lt;/td&gt;&lt;td&gt;(moderates Risiko - etwas komplexerer Block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;21 - 30&lt;/td&gt;&lt;td&gt;(mehr als moderates Risiko - komplexerer Block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;31 - 40&lt;/td&gt;&lt;td&gt;(hohes Risiko - komplexer Block, alarmierend)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&amp;gt; 40&lt;/td&gt;&lt;td&gt;(sehr hohes Risiko - fehleranfälliger, instabiler Block)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
     <message>
-        <location filename="../CyclomaticComplexityDialog.py" line="99"/>
+        <location filename="../CyclomaticComplexityDialog.py" line="102"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Type:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Function&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;M&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Method&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Typ:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Klasse&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Funktion&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;M&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Methode&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;b&gt;Summary:&lt;/b&gt;&lt;br/&gt;{0} blocks (classes, functions, methods) analyzed.&lt;br/&gt;Average complexity: {7} ({8})&lt;table&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{3} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{4} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{5} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{6} blocks&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;b&gt;Zusammenfassung:&lt;/b&gt;&lt;br/&gt;{0} Blöcke (Klassen, Funktionen, Methoden) analysiert.&lt;br/&gt;Mittlere Komplexität: {7} ({8})&lt;table&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} Blöcke&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} Blöcke&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{3} Blöcke&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{4} Blöcke&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{5} Blöcke&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{6} Blöcke&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
@@ -158,17 +158,12 @@
         <translation>%v/%m Dateien</translation>
     </message>
     <message>
-        <location filename="../MaintainabilityIndexDialog.py" line="73"/>
-        <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;score &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; score &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;score &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
-        <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Bewertung:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Wert &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; Wert &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Wert &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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 @@
 &lt;p&gt;Dieser Dialog zeigt den Wartbarkeitsindex und eine Bewertung.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../MaintainabilityIndexDialog.py" line="386"/>
+        <location filename="../MaintainabilityIndexDialog.py" line="387"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{0} files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} files&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Zusammenfassung:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{0} Dateien&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} Dateien&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} Dateien&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
+    <message>
+        <location filename="../MaintainabilityIndexDialog.py" line="73"/>
+        <source>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Rank&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;MI Score&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Maintainability&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;100 - 20&lt;/td&gt;&lt;td&gt;very high&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;19 - 10&lt;/td&gt;&lt;td&gt;medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 - 0&lt;/td&gt;&lt;td&gt;extremely low&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
+        <translation>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Rang&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Wert&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Wartbarkeit&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;100 - 20&lt;/td&gt;&lt;td&gt;sehr hoch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;19 - 10&lt;/td&gt;&lt;td&gt;mittel&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 - 0&lt;/td&gt;&lt;td&gt;extrem niedrig&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;b&gt;Zyklomatische Komplexität...&lt;/b&gt;&lt;p&gt;Dies ermittelt die zyklomatische Komplexität von Python Dateien und zeigt sie zusammen mit einer Bewertung an.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../../PluginMetricsRadon.py" line="1035"/>
+        <location filename="../../PluginMetricsRadon.py" line="1051"/>
         <source>&lt;p&gt;&lt;b&gt;Radon Version {0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Radon is a Python tool that computes various metrics from the source code. Radon can compute:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Raw&lt;/b&gt; metrics (these include SLOC, comment lines, blank lines, multi line strings, ...)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Maintainability Index&lt;/b&gt; (the one used in Visual Studio)&lt;/li&gt;&lt;li&gt;&lt;b&gt;McCabe&apos;s complexity&lt;/b&gt;, i.e. cyclomatic complexity&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</source>
         <translation>&lt;p&gt;&lt;b&gt;Radon Version {0}&lt;/b&gt;&lt;p&gt;Radon ist ein Werkzeug, das verschiedene Metriken für Python Quelltexte ermittelt. Radon kann die folgenden Metriken ermitteln:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Quelltext&lt;/b&gt;metrik (dies beinhaltet Quelltextzeilen, Kommentarzeilen, Leerzeilen, mehrzeilige Zeichenketten, ...)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Wartbarkeitsindex&lt;/b&gt; (wie von Visual Studio)&lt;/li&gt;&lt;li&gt;&lt;b&gt;McCabe Komplexität&lt;/b&gt;, d.h. zyklomatische Komplexität&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines of code (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Source lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logical lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines in multi line strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Blank lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Comment Statistics:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to source lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments plus multi line strings to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
-        <translation>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Textzeilen (LOC = SLOC + Leerzeilen)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Quelltextzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logische Quelltextzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Kommentare&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Kommentarzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Mehrfach&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Zeilen in mehrzeiligen Zeichenketten&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Leer&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Leerzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Kommentarstatistiken:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;K % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Verhältnis Kommentare zu Textzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;K % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Verhältnis Kommentare zu Quelltextzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;K + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Verhältnis der Summe aus Kommentaren und mehrzeiliger Zeichenketten zu Textzeilen&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines of code (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Source lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logical lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&amp;nbsp;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines not containing code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines in multi line strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Blank lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Comment Statistics:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to source lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments plus multi line strings to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
+        <translation>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Textzeilen (LOC = SLOC + Leerzeilen)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Quelltextzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logische Quelltextzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Kommentare&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Kommentarzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;b&gt;Leere&amp;nbsp;Kommentare&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Kommentarzeilen ohne Inhalt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Mehrfach&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Zeilen in mehrzeiligen Zeichenketten&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Leer&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Leerzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Kommentarstatistiken:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;K % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Verhältnis Kommentare zu Textzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;K % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Verhältnis Kommentare zu Quelltextzeilen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;K + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Verhältnis der Summe aus Kommentaren und mehrzeiliger Zeichenketten zu Textzeilen&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td colspan=3&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;1 - 5&lt;/td&gt;&lt;td&gt;(low risk - simple block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;6 - 10&lt;/td&gt;&lt;td&gt;(low risk - well structured and stable block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;11 - 20&lt;/td&gt;&lt;td&gt;(moderate risk - slightly complex block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;21 - 30&lt;/td&gt;&lt;td&gt;(more than moderate risk - more complex block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;31 - 40&lt;/td&gt;&lt;td&gt;(high risk - complex block, alarming)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&amp;gt; 40&lt;/td&gt;&lt;td&gt;(very high risk - error-prone, unstable block)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../CyclomaticComplexityDialog.py" line="99"/>
+        <location filename="../CyclomaticComplexityDialog.py" line="102"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Type:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Function&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;M&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Method&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;b&gt;Summary:&lt;/b&gt;&lt;br/&gt;{0} blocks (classes, functions, methods) analyzed.&lt;br/&gt;Average complexity: {7} ({8})&lt;table&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{3} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{4} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{5} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{6} blocks&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation type="unfinished"></translation>
     </message>
@@ -157,17 +157,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MaintainabilityIndexDialog.py" line="73"/>
-        <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;score &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; score &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;score &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{0} files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} files&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../MaintainabilityIndexDialog.py" line="73"/>
+        <source>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Rank&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;MI Score&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Maintainability&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;100 - 20&lt;/td&gt;&lt;td&gt;very high&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;19 - 10&lt;/td&gt;&lt;td&gt;medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 - 0&lt;/td&gt;&lt;td&gt;extremely low&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;p&gt;&lt;b&gt;Radon Version {0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Radon is a Python tool that computes various metrics from the source code. Radon can compute:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Raw&lt;/b&gt; metrics (these include SLOC, comment lines, blank lines, multi line strings, ...)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Maintainability Index&lt;/b&gt; (the one used in Visual Studio)&lt;/li&gt;&lt;li&gt;&lt;b&gt;McCabe&apos;s complexity&lt;/b&gt;, i.e. cyclomatic complexity&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines of code (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Source lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logical lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines in multi line strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Blank lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Comment Statistics:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to source lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments plus multi line strings to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines of code (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Source lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logical lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&amp;nbsp;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines not containing code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines in multi line strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Blank lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Comment Statistics:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to source lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments plus multi line strings to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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 @@
 &lt;p&gt;Este diálogo muestra la complejidad ciclomática y rango.&lt;/p&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td colspan=3&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;1 - 5&lt;/td&gt;&lt;td&gt;(low risk - simple block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;6 - 10&lt;/td&gt;&lt;td&gt;(low risk - well structured and stable block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;11 - 20&lt;/td&gt;&lt;td&gt;(moderate risk - slightly complex block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;21 - 30&lt;/td&gt;&lt;td&gt;(more than moderate risk - more complex block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;31 - 40&lt;/td&gt;&lt;td&gt;(high risk - complex block, alarming)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&amp;gt; 40&lt;/td&gt;&lt;td&gt;(very high risk - error-prone, unstable block)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=3&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;1 - 5&lt;/td&gt;&lt;td&gt;(riesgo bajo - bloque simple)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;6 - 10&lt;/td&gt;&lt;td&gt;(riesgo bajo - bloque estable y bién estructurado)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;11 - 20&lt;/td&gt;&lt;td&gt;(riesgo moderado - bloque ligeramente complejo)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;21 - 30&lt;/td&gt;&lt;td&gt;(riesgo más que moderado- bloque más complejo)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;31 - 40&lt;/td&gt;&lt;td&gt;(riesgo alto- bloque complejo, alarmante)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&amp;gt; 40&lt;/td&gt;&lt;td&gt;(riesgo muy alto, - propenso a errores, bloque inestable)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
     <message>
-        <location filename="../CyclomaticComplexityDialog.py" line="99"/>
+        <location filename="../CyclomaticComplexityDialog.py" line="102"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Type:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Function&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;M&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Method&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Type:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Clase&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Función&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;M&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Método&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;b&gt;Summary:&lt;/b&gt;&lt;br/&gt;{0} blocks (classes, functions, methods) analyzed.&lt;br/&gt;Average complexity: {7} ({8})&lt;table&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{3} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{4} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{5} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{6} blocks&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;b&gt;Resumen:&lt;/b&gt;&lt;br/&gt;{0} bloques (clases, funciones, métodos) analyzed.&lt;br/&gt;Complejidad media: {7} ({8})&lt;table&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} bloques&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} bloques&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{3} bloques&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{4} bloques&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{5} bloques&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{6} bloques&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
@@ -160,15 +160,15 @@
     <message>
         <location filename="../MaintainabilityIndexDialog.py" line="73"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;score &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; score &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;score &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
-        <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;puntuación &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; puntuación &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;puntuación &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
+        <translation type="obsolete">&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;puntuación &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; puntuación &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;puntuación &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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 @@
 &lt;p&gt;Este diálogo muestra el índice de mantenimiento y rango.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../MaintainabilityIndexDialog.py" line="386"/>
+        <location filename="../MaintainabilityIndexDialog.py" line="387"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{0} files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} files&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Resumen:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{0} archivos&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} archivos&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} archivos&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
+    <message>
+        <location filename="../MaintainabilityIndexDialog.py" line="73"/>
+        <source>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Rank&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;MI Score&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Maintainability&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;100 - 20&lt;/td&gt;&lt;td&gt;very high&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;19 - 10&lt;/td&gt;&lt;td&gt;medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 - 0&lt;/td&gt;&lt;td&gt;extremely low&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;b&gt;Complejidad Ciclomática...&lt;/b&gt;&lt;p&gt;Calcula la complejidad ciclomática de archivos Python y lo muestra con un ranking.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../../PluginMetricsRadon.py" line="1035"/>
+        <location filename="../../PluginMetricsRadon.py" line="1051"/>
         <source>&lt;p&gt;&lt;b&gt;Radon Version {0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Radon is a Python tool that computes various metrics from the source code. Radon can compute:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Raw&lt;/b&gt; metrics (these include SLOC, comment lines, blank lines, multi line strings, ...)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Maintainability Index&lt;/b&gt; (the one used in Visual Studio)&lt;/li&gt;&lt;li&gt;&lt;b&gt;McCabe&apos;s complexity&lt;/b&gt;, i.e. cyclomatic complexity&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</source>
         <translation>&lt;p&gt;&lt;b&gt;Radon Versión {0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Radon es una herramienta de Python que calcula varias métricas a partir del código fuente. Radon puede calcular:&lt;ul&gt;&lt;li&gt;Métricas &lt;b&gt;en bruto&lt;/b&gt; (incluyen SLOC -líneas de código fuente-, líneas de comentarios, líneas en blanco, cadenas multilínea, ...)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Índice de Mantenibilidad&lt;/b&gt; (el que se utiliza en Visual Studio)&lt;/li&gt;&lt;li&gt;&lt;b&gt;complejidad de McCabe&lt;/b&gt;, complejidad ciclomática&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines of code (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Source lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logical lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines in multi line strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Blank lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Comment Statistics:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to source lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments plus multi line strings to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
-        <translation>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas de código (LOC = SLOC + Vacío)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas de código fuente&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas logicas de código&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comentarios&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas de comentarios&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas en cadenas multilínea&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Vacío&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas en blanco&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Estadísticas de Comentarios:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Ratio entre comentarios y líneas&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Ratio entre comentarios y líneas de código fuente&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Ratio entre comentarios más cadenas multilínea y líneas&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
+        <translation type="obsolete">&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas de código (LOC = SLOC + Vacío)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas de código fuente&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas logicas de código&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comentarios&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas de comentarios&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas en cadenas multilínea&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Vacío&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Líneas en blanco&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Estadísticas de Comentarios:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Ratio entre comentarios y líneas&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Ratio entre comentarios y líneas de código fuente&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Ratio entre comentarios más cadenas multilínea y líneas&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines of code (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Source lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logical lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&amp;nbsp;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines not containing code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines in multi line strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Blank lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Comment Statistics:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to source lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments plus multi line strings to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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 @@
 &lt;p&gt;Данный диалог отображает цикломатическую сложность и ее уровень.&lt;/p&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td colspan=3&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;1 - 5&lt;/td&gt;&lt;td&gt;(low risk - simple block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;6 - 10&lt;/td&gt;&lt;td&gt;(low risk - well structured and stable block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;11 - 20&lt;/td&gt;&lt;td&gt;(moderate risk - slightly complex block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;21 - 30&lt;/td&gt;&lt;td&gt;(more than moderate risk - more complex block)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;31 - 40&lt;/td&gt;&lt;td&gt;(high risk - complex block, alarming)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&amp;gt; 40&lt;/td&gt;&lt;td&gt;(very high risk - error-prone, unstable block)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=3&gt;&lt;b&gt;Ранжирование:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;1 - 5&lt;/td&gt;&lt;td&gt;(низкий риск - простой блок)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;6 - 10&lt;/td&gt;&lt;td&gt;(низкий риск - хорошо структурированный стабильный блок)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;11 - 20&lt;/td&gt;&lt;td&gt;(умеренный риск - немного сложный блок)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td&gt;21 - 30&lt;/td&gt;&lt;td&gt;(более чем умеренный риск - более сложный блок)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td&gt;31 - 40&lt;/td&gt;&lt;td&gt;(высокий риск - сложный, аварийный блок)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&amp;gt; 40&lt;/td&gt;&lt;td&gt;(очень высокий риск - нестабильный блок, подвержен ошибкам)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
     <message>
-        <location filename="../CyclomaticComplexityDialog.py" line="99"/>
+        <location filename="../CyclomaticComplexityDialog.py" line="102"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Type:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Function&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;M&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Method&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Тип:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Класс&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Функция&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;M&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Метод&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;b&gt;Summary:&lt;/b&gt;&lt;br/&gt;{0} blocks (classes, functions, methods) analyzed.&lt;br/&gt;Average complexity: {7} ({8})&lt;table&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{3} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{4} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{5} blocks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{6} blocks&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;b&gt;Сводка:&lt;/b&gt;&lt;br/&gt;{0} блоков (классов, функций, методов) проанализировано.&lt;br/&gt;Средняя сложность: {7} ({8})&lt;table&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} блоков&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} блоков&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{3} блоков&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{4} блоков&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{5} блоков&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=30&gt;&lt;b&gt;F&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{6} блоков&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
@@ -160,15 +160,15 @@
     <message>
         <location filename="../MaintainabilityIndexDialog.py" line="73"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Ranking:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;score &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; score &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;score &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
-        <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Ранжирование:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;баллы &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; баллы &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;баллы &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
+        <translation type="obsolete">&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Ранжирование:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;баллы &amp;gt; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 &amp;lt; баллы &amp;le; 19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;баллы &amp;le; 9&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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 @@
 &lt;p&gt;Данный диалог отображает индекс сложности  поддержки и его уровень.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../MaintainabilityIndexDialog.py" line="386"/>
+        <location filename="../MaintainabilityIndexDialog.py" line="387"/>
         <source>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Summary:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{0} files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} files&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
         <translation>&lt;table&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Сводка:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{0} файлов&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{1} файлов&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td align=&apos;right&apos;&gt;{2} файлов&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
     </message>
+    <message>
+        <location filename="../MaintainabilityIndexDialog.py" line="73"/>
+        <source>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Rank&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;MI Score&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Maintainability&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;&lt;td&gt;100 - 20&lt;/td&gt;&lt;td&gt;very high&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;&lt;td&gt;19 - 10&lt;/td&gt;&lt;td&gt;medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;&lt;td&gt;9 - 0&lt;/td&gt;&lt;td&gt;extremely low&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;b&gt;Цикломатическая сложность...&lt;/b&gt;&lt;p&gt;Вычисляет цикломатическую сложность файлов Python и показывает ее уровень.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../../PluginMetricsRadon.py" line="1035"/>
+        <location filename="../../PluginMetricsRadon.py" line="1051"/>
         <source>&lt;p&gt;&lt;b&gt;Radon Version {0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Radon is a Python tool that computes various metrics from the source code. Radon can compute:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Raw&lt;/b&gt; metrics (these include SLOC, comment lines, blank lines, multi line strings, ...)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Maintainability Index&lt;/b&gt; (the one used in Visual Studio)&lt;/li&gt;&lt;li&gt;&lt;b&gt;McCabe&apos;s complexity&lt;/b&gt;, i.e. cyclomatic complexity&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</source>
         <translation>&lt;p&gt;&lt;b&gt;Версия Radon {0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Radon является инструментом Python, позволяющим вычислять различные метрики исходного кода. Radon позволяет оценить:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Raw&lt;/b&gt; метрики (к их числу  относятся  SLOC, строки коментариев, пустые строки, многострочный текст, ...)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Индекс сложности поддержки (качества кода)&lt;/b&gt; (применяется в Visual Studio)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Мак-Кейба сложность&lt;/b&gt;, то есть цикломатическая сложность&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines of code (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Source lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logical lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines in multi line strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Blank lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Comment Statistics:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to source lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments plus multi line strings to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
-        <translation>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество строк кода (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество исходных строк кода&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество логических строк кода&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество строк комментариев&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество строк  многострочного текста&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество пустых строк&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Статистика коментариев:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Процент строк комментариев к общему числу строк&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Процент строк комментариев к числу строк исходного кода&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Процент строк комментариев + многострочного текста к  общему числу строк&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</translation>
+        <translation type="obsolete">&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество строк кода (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество исходных строк кода&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество логических строк кода&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество строк комментариев&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество строк  многострочного текста&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Количество пустых строк&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Статистика коментариев:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Процент строк комментариев к общему числу строк&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Процент строк комментариев к числу строк исходного кода&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Процент строк комментариев + многострочного текста к  общему числу строк&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines of code (LOC = SLOC + Empty)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;SLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Source lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;LLOC&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Logical lines of code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&amp;nbsp;Comments&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comment lines not containing code&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Multi&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Lines in multi line strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Empty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Blank lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&lt;b&gt;Comment Statistics:&lt;/b&gt;&lt;/td&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C % S&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments to source lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;C + M % L&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Comments plus multi line strings to lines ratio&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</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)

eric ide

mercurial