Bladeren bron

- Defect fixed: critical performance issue for iterative runs
- Defect fixed: fixed counting of magic numbers

avkonst 11 jaren geleden
bovenliggende
commit
b2801e7896

+ 2 - 0
mainline/CHANGELOG.md

@@ -3,6 +3,8 @@
 (use MetricPluginMixin.*Counter classes instead)
 - New metric: std.code.todo:comments - number of todo markers in comments.
 - New metric: std.code.todo:strings - number of todo markers in strings.
+- Defect fixed: critical performance issue for iterative runs
+- Defect fixed: fixed counting of magic numbers
 
 ## 1.2 (August, 2013)
 - **Feature** suppressions capability for limit tool

+ 11 - 11
mainline/doc/home.html

@@ -1161,7 +1161,7 @@ class Plugin(mpp.api.Plugin,
         self.declare_metric(
             self.is_active_numbers, # to count if active in callback
             self.Field('numbers', int), # field name and type in the database
-            re.compile(r'''[0-9]+'''), # pattern to search
+            re.compile(r'''\b[0-9]+\b'''), # pattern to search
             marker_type_mask=mpp.api.Marker.T.CODE, # search in code
             region_type_mask=mpp.api.Region.T.ANY) # search in all types of regions
         
@@ -1220,7 +1220,7 @@ class Plugin(mpp.api.Plugin,
     def initialize(self):
         # improve pattern to find declarations of constants
         pattern_to_search = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int),
                             # give a pair of pattern + custom counter logic class
@@ -1275,13 +1275,13 @@ class Plugin(mpp.api.Plugin,
     def initialize(self):
         # specialized pattern for java
         pattern_to_search_java = re.compile(
-            r'''(const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         # pattern for C++ and C# languages
         pattern_to_search_cpp_cs = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         # pattern for all other languages
         pattern_to_search = re.compile(
-            r'''[0-9]+''')
+            r'''\b[0-9]+\b''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int),
                             # dictionary of pairs instead of a single pair
@@ -1336,11 +1336,11 @@ class Plugin(mpp.api.Plugin,
     
     def initialize(self):
         pattern_to_search_java = re.compile(
-            r'''(const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search_cpp_cs = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search = re.compile(
-            r'''[0-9]+''')
+            r'''\b[0-9]+\b''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int,
                                 # optimize the size of datafile:
@@ -1401,11 +1401,11 @@ class Plugin(mpp.api.Plugin,
     
     def initialize(self):
         pattern_to_search_java = re.compile(
-            r'''(const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search_cpp_cs = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search = re.compile(
-            r'''[0-9]+''')
+            r'''\b[0-9]+\b''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int,
                                 non_zero=True),

+ 6 - 0
mainline/ext/std/code/cpp.py

@@ -45,7 +45,13 @@ class Plugin(mpp.api.Plugin, mpp.api.Parent, mpp.api.IParser, mpp.api.IConfigura
         count_mismatched_brackets = 0
         if is_updated == True:
             count_mismatched_brackets = CppCodeParser().run(data)
+        #else:
+        #    data.load_regions()
+            #data.load_markers()
         self.notify_children(data, is_updated)
+        # TODO: if not updated number of parser errors is zero, should read from the prev database
+        # but reading of number of errors from the database will slow the process
+        # maybe it is better to return zero always?
         return count_mismatched_brackets
             
 class CppCodeParser(object):

+ 1 - 1
mainline/ext/std/code/magic.ini

@@ -18,7 +18,7 @@
 ;
 
 [Plugin]
-version: 1.0
+version: 1.1
 package: std.code
 module:  magic
 class:   Plugin

+ 2 - 2
mainline/ext/std/code/magic.py

@@ -40,9 +40,9 @@ class Plugin(mpp.api.Plugin,
     
     def initialize(self):
         pattern_to_search_java = re.compile(
-            r'''(const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search_cpp_cs = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int,
                                 non_zero=True),

+ 20 - 19
mainline/ext/std/tools/debug.py

@@ -62,26 +62,27 @@ def dumphtml(args, loader):
         text = fh.read()
         fh.close()
         
+        # TODO fix highlightning of markers
+#        result += '<table><tr><td><pre>'
+#        last_pos = 0
+#        for marker in data.iterate_markers(filter_group= mpp.api.Marker.T.COMMENT |
+#                                           mpp.api.Marker.T.STRING |
+#                                           mpp.api.Marker.T.PREPROCESSOR):
+#            result += (cgi.escape(text[last_pos:marker.begin]))
+#            if marker.get_type() == mpp.api.Marker.T.STRING:
+#                result += ('<span style="color:#0000FF">')
+#            elif marker.get_type() == mpp.api.Marker.T.COMMENT:
+#                result += ('<span style="color:#009900">')
+#            elif marker.get_type() == mpp.api.Marker.T.PREPROCESSOR:
+#                result += ('<span style="color:#990000">')
+#            else:
+#                assert False, "Uknown marker type"
+#            result += (cgi.escape(text[marker.begin:marker.end]))
+#            result += ('</span>')
+#            last_pos = marker.end
+#        result += (cgi.escape(text[last_pos:]))
+#        result += ('</pre></td><td><pre>')
         result += '<table><tr><td><pre>'
-        last_pos = 0
-        for marker in data.iterate_markers(filter_group= mpp.api.Marker.T.COMMENT |
-                                           mpp.api.Marker.T.STRING |
-                                           mpp.api.Marker.T.PREPROCESSOR):
-            result += (cgi.escape(text[last_pos:marker.begin]))
-            if marker.get_type() == mpp.api.Marker.T.STRING:
-                result += ('<span style="color:#0000FF">')
-            elif marker.get_type() == mpp.api.Marker.T.COMMENT:
-                result += ('<span style="color:#009900">')
-            elif marker.get_type() == mpp.api.Marker.T.PREPROCESSOR:
-                result += ('<span style="color:#990000">')
-            else:
-                assert False, "Uknown marker type"
-            result += (cgi.escape(text[marker.begin:marker.end]))
-            result += ('</span>')
-            last_pos = marker.end
-        result += (cgi.escape(text[last_pos:]))
-        last_pos = 0
-        result += ('</pre></td><td><pre>')
         styles = [('<span style="background-color:#F0F010">',
                   '<span style="background-color:#F010F0">'),
                   ('<span style="background-color:#F0F030">',

+ 3 - 1
mainline/metrixpp.py

@@ -38,7 +38,9 @@ def main():
     if exemode != "-R" and exemode != "-D":
         exemode = '-D' # TODO implement install and release mode
         # inject '-D' or '-R' option
-        exit(subprocess.call(itertools.chain([sys.executable, sys.argv[0], '-D'], sys.argv[1:])))
+        #profile_args = ['-m', 'cProfile']
+        profile_args = []
+        exit(subprocess.call(itertools.chain([sys.executable], profile_args, [sys.argv[0], '-D'], sys.argv[1:])))
 
     command = ""
     if len(sys.argv[1:]) > 1:

+ 22 - 5
mainline/mpp/api.py

@@ -287,7 +287,12 @@ class FileData(LoadableData):
         
     def add_region(self, region_name, offset_begin, offset_end, line_begin, line_end, cursor_line, group, checksum):
         if self.regions == None:
-            self.regions = [] # do not load in time of collection
+            # # do not load regions and markers in time of collection
+            # if region is added first by parser, set markers to empty list as well
+            # because if there are no markers in a file, it forces loading of markers
+            # during iterate_markers call
+            self.regions = []
+            self.markers = []
         new_id = len(self.regions) + 1
         self._internal_append_region(Region(self.loader, self.get_id(), new_id, region_name, offset_begin, offset_end, line_begin, line_end, cursor_line, group, checksum))
         self.loader.db.create_region(self.file_id, new_id, region_name, offset_begin, offset_end, line_begin, line_end, cursor_line, group, checksum)
@@ -308,15 +313,25 @@ class FileData(LoadableData):
 
     def load_markers(self):
         if self.markers == None:
+            # TODO add assert in case of an attempt to load data during collection
+            assert(False) # TODO not used in post-processing tools for while, need to be fixed
             self.markers = []
             for each in self.loader.db.iterate_markers(self.get_id()):
                 self.markers.append(Marker(each.begin, each.end, each.group))
         
     def add_marker(self, offset_begin, offset_end, group):
         if self.markers == None:
-            self.markers = [] # do not load in time of collection
+            # # do not load regions and markers in time of collection
+            # if marker is added first by parser, set regions to empty list as well
+            # because if there are no regions in a file, it forces loading of regions
+            # during iterate_regions call
+            self.regions = []
+            self.markers = []
         self.markers.append(Marker(offset_begin, offset_end, group))
-        self.loader.db.create_marker(self.file_id, offset_begin, offset_end, group)
+        # TODO drop collecting markers, it is faster to double parse
+        # it is not the same with regions, it is faster to load regions
+        # on iterative re-run
+        #self.loader.db.create_marker(self.file_id, offset_begin, offset_end, group)
         
     def iterate_markers(self, filter_group = Marker.T.ANY,
                          region_id = None, exclude_children = True, merge = False):
@@ -775,6 +790,8 @@ class Loader(object):
             def __iter__(self):
                 return self.iterator
         
+        # TODO can construct to add multiple rows at one sql query
+        # to improve the performance
         for namespace in file_data.iterate_namespaces():
             if file_data.is_namespace_updated(namespace) == False:
                 continue
@@ -958,13 +975,13 @@ class Plugin(BasePlugin):
 
         if (len(fields) != 0 or len(properties) != 0):
             prev_version = db_loader.set_property(self.get_name() + ":version", self.get_version())
-            if prev_version != self.get_version():
+            if str(prev_version) != str(self.get_version()):
                 self.is_updated = True
 
         for prop in properties:
             assert(prop.name != 'version')
             prev_prop = db_loader.set_property(self.get_name() + ":" + prop.name, prop.value)
-            if prev_prop != prop.value:
+            if str(prev_prop) != str(prop.value):
                 self.is_updated = True
 
         if len(fields) != 0:

+ 20 - 5
mainline/mpp/internal/dbwrap.py

@@ -88,6 +88,7 @@ class Database(object):
         
         self.last_used_id += 1
         self.id = self.last_used_id
+        self._tables_cache = None
     
     def __del__(self):
         if self.conn != None:
@@ -116,6 +117,7 @@ class Database(object):
                 sql = "DELETE FROM __tables__ WHERE id = '" + str(table['id']) + "'"
                 db_loader.log(sql)
                 db_loader.conn.execute(sql)
+                self._tables_cache = None # reset cache when a list of tables is modified
                 sql = "DROP TABLE '" + table['name'] + "'"
                 db_loader.log(sql)
                 db_loader.conn.execute(sql)
@@ -128,23 +130,32 @@ class Database(object):
                 db_loader.log(sql)
                 db_loader.conn.execute(sql)
                 sql = "UPDATE '" + column['table_name'] + "' SET '" + column['column_name'] + "' = NULL"
+                # TODO bug here: collect with column, recollect without, recollect with again
+                # it will be impossible to create the column in the table
                 db_loader.log(sql)
                 db_loader.conn.execute(sql)
             
             self.clean_up_file(db_loader)
 
         def clean_up_file(self, db_loader, file_id = None):
-            sql = "SELECT * FROM __tables__"
-            db_loader.log(sql)
-            for table in itertools.chain(db_loader.conn.execute(sql).fetchall(), [{'name':'__regions__'}, {'name':'__markers__'}]):
+            # this function is called on every updated file, so cache table names
+            if db_loader._tables_cache == None:
+                db_loader._tables_cache = []
+                sql = "SELECT * FROM __tables__"
+                db_loader.log(sql)
+                for table in db_loader.conn.execute(sql).fetchall():
+                    db_loader._tables_cache.append(table['name'])
+
+            for table_name in itertools.chain(db_loader._tables_cache, ['__regions__', '__markers__']):
                 sql = ""
                 if file_id == None:
-                    sql = "DELETE FROM '" + table['name'] + "' WHERE file_id IN (SELECT __files__.id FROM __files__ WHERE __files__.confirmed = 0)"
+                    sql = "DELETE FROM '" + table_name + "' WHERE file_id IN (SELECT __files__.id FROM __files__ WHERE __files__.confirmed = 0)"
                 else:
-                    sql = "DELETE FROM '" + table['name'] + "' WHERE (file_id = " + str(file_id) + ")"
+                    sql = "DELETE FROM '" + table_name + "' WHERE (file_id = " + str(file_id) + ")"
                 db_loader.log(sql)
                 db_loader.conn.execute(sql)
             
+            
     class InternalPathUtils(object):
         
         def iterate_heads(self, path):
@@ -206,6 +217,7 @@ class Database(object):
             sql = "UPDATE __tables__ SET confirmed = 0"
             self.log(sql)
             self.conn.execute(sql)
+            self._tables_cache = None # reset cache when a list of tables is modified
             sql = "UPDATE __columns__ SET confirmed = 0"
             self.log(sql)
             self.conn.execute(sql)
@@ -235,6 +247,7 @@ class Database(object):
                 sql = "CREATE TABLE __tables__ (id integer NOT NULL PRIMARY KEY, name text NOT NULL, version text NOT NULL, support_regions integer NOT NULL, confirmed integer NOT NULL, UNIQUE (name))"
                 self.log(sql)
                 self.conn.execute(sql)
+                self._tables_cache = None # reset cache when a list of tables is modified
                 sql = "CREATE TABLE __columns__ (id integer NOT NULL PRIMARY KEY, name text NOT NULL, type text NOT NULL, table_id integer NOT_NULL, non_zero integer NOT NULL, confirmed integer NOT NULL, UNIQUE (name, table_id))"
                 self.log(sql)
                 self.conn.execute(sql)
@@ -284,6 +297,8 @@ class Database(object):
     def create_table(self, table_name, support_regions = False, version='1.0'):
         assert(self.read_only == False)
 
+        self._tables_cache = None # reset cache when a list of tables is modified
+        
         sql = "SELECT * FROM __tables__ WHERE (name = '" + table_name + "'AND confirmed == 0)"
         self.log(sql)
         result = self.conn.execute(sql).fetchall()

+ 2 - 2
mainline/tests/general/test_basic/sources/simple.cpp

@@ -12,7 +12,7 @@ class A
 	A()
 	{
 		/* first funtion */
-		this->m_member = 10;
+		this->m_me88er = 10;
 		if (a & b)
 		{
 			for (int i = 0; i < 0 && i > 0; i++)
@@ -64,7 +64,7 @@ class A
 		return 1;
 	}
 
-	int m_member = 10;
+	int m_me88er = 10;
 };
 
 }

+ 2 - 2
mainline/tests/general/test_basic/sources_changed/simple.cpp

@@ -13,7 +13,7 @@ class A
 	A()
 	{
 		/* first funtion */
-		this->m_member = 10;
+		this->m_me88er = 10;
 		if (a & b)
 		{
 			for (int i = 0; i < 0 && i > 0; i++)
@@ -71,7 +71,7 @@ class A
 		return 'B';
 	}
 
-	int m_member = 10;
+	int m_me88er = 10;
 };
 
 }

+ 3 - 73
mainline/tests/general/test_basic/test_debug_tool_debug_default_stdout.gold.txt

@@ -1,74 +1,4 @@
-<html><body><table><tr><td><pre>
-
-<span style="color:#009900">// Just produce any code in order to test basic workflow</span>
-namespace hmm
-{
-
-<span style="color:#990000">#define old_prep</span>
-
-class A
-{
-
-	A()
-	{
-		<span style="color:#009900">/* first funtion */</span>
-		this-&gt;m_member = 10;
-		if (a &amp; b)
-		{
-			for (int i = 0; i &lt; 0 &amp;&amp; i &gt; 0; i++)
-			{
-				int a; <span style="color:#009900">// right?</span>
-			}
-		}
-	}
-
-
-	int func(int param = 5)
-	{
-		class embeded
-		{
-			embeded()
-			{
-				int a = 10;
-				if (true)
-				{
-					<span style="color:#009900">// again crazy</span>
-				}
-			}
-		};
-		if (a);
-	}
-
-	int func_to_be_removed_in_new_sources(int param = 5)
-	{
-		class embeded
-		{
-			embeded()
-			{
-				int a = 10;
-				if ("<span style="color:#0000FF">text</span>")
-				{
-					<span style="color:#009900">/* again crazy */</span>
-				}
-			}
-		};
-		if (a &amp;&amp; b);
-	}
-
-	int never(int how_long = 999)
-	{
-		while(true)
-		{
-
-		}
-		return 1;
-	}
-
-	int m_member = 10;
-};
-
-}
-</pre></td><td><pre><span style="background-color:#F0F010"><a href="#line0" id=line"0"></a>
+<html><body><table><tr><td><pre><span style="background-color:#F0F010"><a href="#line0" id=line"0"></a>
 
 <span style="background-color:#F0F070"><a href="#line4" id=line"4"></a>// Just produce any code in order to test basic workflow
 namespace hmm
@@ -82,7 +12,7 @@ namespace hmm
 	<span style="background-color:#F0F030"><a href="#line12" id=line"12"></a>A()
 	{
 		/* first funtion */
-		this-&gt;m_member = 10;
+		this-&gt;m_me88er = 10;
 		if (a &amp; b)
 		{
 			for (int i = 0; i &lt; 0 &amp;&amp; i &gt; 0; i++)
@@ -134,7 +64,7 @@ namespace hmm
 		return 1;
 	}</span>
 
-	int m_member = 10;
+	int m_me88er = 10;
 }</span>;
 
 }</span>

+ 2 - 2
mainline/tests/general/test_basic/test_workflow_info_default_stdout.gold.txt

@@ -8,7 +8,7 @@ test_workflow.db:: info: Created using plugins and settings:
 	std.code.java:version: 1.1
 	std.code.java:files: *.java
 	std.code.lines:version: 1.1
-	std.code.magic:version: 1.0
+	std.code.magic:version: 1.1
 	std.code.magic:number.simplier: False
 	std.code.todo:version: 1.0
 	std.code.todo:tags: FIXME,FixMe,HACK,TBD,TODO,ToDo,XXX
@@ -27,5 +27,5 @@ test_workflow.db:: info: Collected metrics:
 
 :: info: Processed files and checksums:
 	./file_deleted_in_new_sources.cpp: 0xfd51c243
-	./simple.cpp   : 0x83ea59bb
+	./simple.cpp   : 0xcf51202e
 

+ 2 - 2
mainline/tests/general/test_basic/test_workflow_info_second_stdout.gold.txt

@@ -8,7 +8,7 @@ test_workflow.db:: info: Created using plugins and settings:
 	std.code.java:version: 1.1
 	std.code.java:files: *.java
 	std.code.lines:version: 1.1
-	std.code.magic:version: 1.0
+	std.code.magic:version: 1.1
 	std.code.magic:number.simplier: False
 	std.code.todo:version: 1.0
 	std.code.todo:tags: FIXME,FixMe,HACK,TBD,TODO,ToDo,XXX
@@ -26,6 +26,6 @@ test_workflow.db:: info: Collected metrics:
 	std.suppress.file:list: 
 
 :: info: Processed files and checksums:
-	./simple.cpp   : 0xc2c1e477 [modified]
+	./simple.cpp   : 0xa0fb97eb [modified]
 	./simple2.cpp  : 0x44023f81 [new]
 

+ 1 - 1
mainline/tests/system/test_api_tutorial/ext/step4/myext/magic.py

@@ -39,7 +39,7 @@ class Plugin(mpp.api.Plugin,
         self.declare_metric(
             self.is_active_numbers, # to count if active in callback
             self.Field('numbers', int), # field name and type in the database
-            re.compile(r'''[0-9]+'''), # pattern to search
+            re.compile(r'''\b[0-9]+\b'''), # pattern to search
             marker_type_mask=mpp.api.Marker.T.CODE, # search in code
             region_type_mask=mpp.api.Region.T.ANY) # search in all types of regions
         

+ 1 - 1
mainline/tests/system/test_api_tutorial/ext/step5/myext/magic.py

@@ -36,7 +36,7 @@ class Plugin(mpp.api.Plugin,
     def initialize(self):
         # improve pattern to find declarations of constants
         pattern_to_search = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int),
                             # give a pair of pattern + custom counter logic class

+ 3 - 3
mainline/tests/system/test_api_tutorial/ext/step6/myext/magic.py

@@ -36,13 +36,13 @@ class Plugin(mpp.api.Plugin,
     def initialize(self):
         # specialized pattern for java
         pattern_to_search_java = re.compile(
-            r'''(const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         # pattern for C++ and C# languages
         pattern_to_search_cpp_cs = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         # pattern for all other languages
         pattern_to_search = re.compile(
-            r'''[0-9]+''')
+            r'''\b[0-9]+\b''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int),
                             # dictionary of pairs instead of a single pair

+ 3 - 3
mainline/tests/system/test_api_tutorial/ext/step7/myext/magic.py

@@ -35,11 +35,11 @@ class Plugin(mpp.api.Plugin,
     
     def initialize(self):
         pattern_to_search_java = re.compile(
-            r'''(const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search_cpp_cs = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search = re.compile(
-            r'''[0-9]+''')
+            r'''\b[0-9]+\b''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int,
                                 # optimize the size of datafile:

+ 3 - 3
mainline/tests/system/test_api_tutorial/ext/step8/myext/magic.py

@@ -41,11 +41,11 @@ class Plugin(mpp.api.Plugin,
     
     def initialize(self):
         pattern_to_search_java = re.compile(
-            r'''(const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_$a-zA-Z][_$a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search_cpp_cs = re.compile(
-            r'''(const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)?[-+]?[0-9]+''')
+            r'''((const\s+([_a-zA-Z][_a-zA-Z0-9]*\s+)+[=]\s*)[-+]?[0-9]+\b)|(\b[0-9]+\b)''')
         pattern_to_search = re.compile(
-            r'''[0-9]+''')
+            r'''\b[0-9]+\b''')
         self.declare_metric(self.is_active_numbers,
                             self.Field('numbers', int,
                                 non_zero=True),

+ 1 - 1
mainline/tests/system/test_boost_parts/test_workflow_info_default_stdout.gold.txt

@@ -8,7 +8,7 @@ test_workflow.db:: info: Created using plugins and settings:
 	std.code.java:version: 1.1
 	std.code.java:files: *.java
 	std.code.lines:version: 1.1
-	std.code.magic:version: 1.0
+	std.code.magic:version: 1.1
 	std.code.magic:number.simplier: False
 	std.code.todo:version: 1.0
 	std.code.todo:tags: FIXME,FixMe,HACK,TBD,TODO,ToDo,XXX