Browse Source

general.nest-regions options for export tool added

avkonst 12 years ago
parent
commit
7840e060e6

+ 48 - 21
mainline/export.py

@@ -44,11 +44,15 @@ def main():
                       " If not defined all namespaces available in database file will be processed."
                       " Separate several namespaces by comma, for example 'general,std.code.complexity'"
                       " [default: %default]")
+    parser.add_option("--general.nest-regions", action="store_true", default=False,
+                      help="If the option is set (True), data for regions is exported in the form of a tree. "
+                      "Otherwise, all regions are exported in plain list. [default: %default]")
 
     (options, args) = parser.parse_args()
     log_plugin.configure(options)
     db_plugin.configure(options)
     out_format = options.__dict__['general.format']
+    nest_regions = options.__dict__['general.nest_regions']
     namespaces = None
     if options.__dict__['general.namespaces'] != None:
         namespaces = re.split(',', options.__dict__['general.namespaces'])
@@ -66,11 +70,11 @@ def main():
     else:
         paths = args
         
-    (result, exit_code) = export_to_str(out_format, paths, loader, loader_prev, namespaces)
+    (result, exit_code) = export_to_str(out_format, paths, loader, loader_prev, namespaces, nest_regions)
     print result
     return exit_code
 
-def export_to_str(out_format, paths, loader, loader_prev, namespaces):
+def export_to_str(out_format, paths, loader, loader_prev, namespaces, nest_regions):
     exit_code = 0
     result = ""
     if out_format == 'txt':
@@ -104,7 +108,7 @@ def export_to_str(out_format, paths, loader, loader_prev, namespaces):
         if file_data != None:
             file_data_tree = file_data.get_data_tree(namespaces=namespaces) 
             file_data_prev = loader_prev.load_file_data(path)
-            append_regions(file_data_tree, file_data, file_data_prev, namespaces)
+            append_regions(file_data_tree, file_data, file_data_prev, namespaces, nest_regions)
         
         data = {"info": {"path": path, "id": ind + 1},
                 "aggregated-data": aggregated_data_tree,
@@ -131,29 +135,52 @@ def export_to_str(out_format, paths, loader, loader_prev, namespaces):
         
     return (result, exit_code)
 
-def append_regions(file_data_tree, file_data, file_data_prev, namespaces):
+def append_regions(file_data_tree, file_data, file_data_prev, namespaces, nest_regions):
     regions_matcher = None
     if file_data_prev != None:
         file_data_tree = append_diff(file_data_tree,
                                      file_data_prev.get_data_tree(namespaces=namespaces))
         regions_matcher = core.db.utils.FileRegionsMatcher(file_data, file_data_prev)
-    regions = []
-    for each in file_data.iterate_regions():
-        region_data_tree = each.get_data_tree(namespaces=namespaces)
-        if regions_matcher != None and regions_matcher.is_matched(each.get_id()):
-            region_data_prev = file_data_prev.get_region(regions_matcher.get_prev_id(each.get_id()))
-            region_data_tree = append_diff(region_data_tree,
-                                           region_data_prev.get_data_tree(namespaces=namespaces))
-        regions.append({"info": {"name" : each.name,
-                                 'type' : file_data.get_region_types()().to_str(each.get_type()),
-                                 "cursor" : each.cursor,
-                                 'line_begin': each.line_begin,
-                                 'line_end': each.line_end,
-                                 'offset_begin': each.begin,
-                                 'offset_end': each.end},
-                        "data": region_data_tree})
-        
-    file_data_tree['regions'] = regions
+    
+    if nest_regions == False:
+        regions = []
+        for region in file_data.iterate_regions():
+            region_data_tree = region.get_data_tree(namespaces=namespaces)
+            if regions_matcher != None and regions_matcher.is_matched(region.get_id()):
+                region_data_prev = file_data_prev.get_region(regions_matcher.get_prev_id(region.get_id()))
+                region_data_tree = append_diff(region_data_tree,
+                                               region_data_prev.get_data_tree(namespaces=namespaces))
+            regions.append({"info": {"name" : region.name,
+                                     'type' : file_data.get_region_types()().to_str(region.get_type()),
+                                     "cursor" : region.cursor,
+                                     'line_begin': region.line_begin,
+                                     'line_end': region.line_end,
+                                     'offset_begin': region.begin,
+                                     'offset_end': region.end},
+                            "data": region_data_tree})
+        file_data_tree['regions'] = regions
+    else:
+        def append_rec(region_id, file_data_tree, file_data, file_data_prev, namespaces):
+            region = file_data.get_region(region_id)
+            region_data_tree = region.get_data_tree(namespaces=namespaces)
+            if regions_matcher != None and regions_matcher.is_matched(region.get_id()):
+                region_data_prev = file_data_prev.get_region(regions_matcher.get_prev_id(region.get_id()))
+                region_data_tree = append_diff(region_data_tree,
+                                               region_data_prev.get_data_tree(namespaces=namespaces))
+            result = {"info": {"name" : region.name,
+                               'type' : file_data.get_region_types()().to_str(region.get_type()),
+                               "cursor" : region.cursor,
+                               'line_begin': region.line_begin,
+                               'line_end': region.line_end,
+                               'offset_begin': region.begin,
+                               'offset_end': region.end},
+                      "data": region_data_tree,
+                      "subregions": []}
+            for sub_id in file_data.get_region(region_id).iterate_subregion_ids():
+                result['subregions'].append(append_rec(sub_id, file_data_tree, file_data, file_data_prev, namespaces))
+            return result
+        file_data_tree['regions'] = []
+        file_data_tree['regions'].append(append_rec(1, file_data_tree, file_data, file_data_prev, namespaces))
 
 def append_diff(main_tree, prev_tree):
     assert(main_tree != None)

+ 20 - 1
mainline/tests/general/test_basic.py

@@ -149,7 +149,7 @@ class Test(tests.common.TestCase):
 
     def test_export_format(self):
 
-        runner = tests.common.ToolRunner('collect', ['--std.code.complexity.on'])
+        runner = tests.common.ToolRunner('collect', ['--std.code.complexity.on'], save_prev=True)
         self.assertExec(runner.run())
 
         runner = tests.common.ToolRunner('export', ['--general.format=txt'], prefix='txt')
@@ -161,6 +161,25 @@ class Test(tests.common.TestCase):
         runner = tests.common.ToolRunner('export', ['--general.format=xml'], prefix='xml')
         self.assertExec(runner.run())
         
+        runner = tests.common.ToolRunner('collect',
+                                         ['--std.code.complexity.on'],
+                                         prefix='nest',
+                                         cwd="sources_changed",
+                                         use_prev=True)
+        self.assertExec(runner.run())
+
+        runner = tests.common.ToolRunner('export',
+                                         ['--general.nest-regions'],
+                                         prefix='nest',
+                                         use_prev=True)
+        self.assertExec(runner.run())
+
+        runner = tests.common.ToolRunner('export',
+                                         ['--general.nest-regions', '--general.format=xml'],
+                                         prefix='nest_per_file',
+                                         dirs_list=['./simple.cpp'],
+                                         use_prev=True)
+        self.assertExec(runner.run())
         
 
 if __name__ == '__main__':

+ 0 - 0
mainline/tests/general/test_basic/test_export_format_collect_nest_stdout.gold.txt


+ 106 - 0
mainline/tests/general/test_basic/test_export_format_export_nest_per_file_stdout.gold.txt

@@ -0,0 +1,106 @@
+<export>
+
+    <data>
+        <info path="./simple.cpp" id="1" />
+        <file-data>
+            <regions>
+                <region>
+                    <info cursor="0" name="__global__" offset_end="639" line_begin="3" type="global" line_end="65" offset_begin="2" />
+                    <data />
+                    <subregions>
+                        <subregion>
+                            <info cursor="4" name="hmm" offset_end="638" line_begin="3" type="namespace" line_end="64" offset_begin="2" />
+                            <data />
+                            <subregions>
+                                <subregion>
+                                    <info cursor="7" name="A" offset_end="634" line_begin="7" type="class" line_end="62" offset_begin="76" />
+                                    <data />
+                                    <subregions>
+                                        <subregion>
+                                            <info cursor="10" name="A" offset_end="234" line_begin="10" type="function" line_end="21" offset_begin="88" />
+                                            <data>
+                                                <std.code.complexity cyclomatic="3">
+                                                    <__diff__ cyclomatic="0" />
+                                                </std.code.complexity>
+                                            </data>
+                                            <subregions>
+                                            </subregions>
+                                        </subregion>
+                                        <subregion>
+                                            <info cursor="23" name="func" offset_end="420" line_begin="23" type="function" line_end="39" offset_begin="237" />
+                                            <data>
+                                                <std.code.complexity cyclomatic="1">
+                                                    <__diff__ cyclomatic="0" />
+                                                </std.code.complexity>
+                                            </data>
+                                            <subregions>
+                                                <subregion>
+                                                    <info cursor="25" name="embeded" offset_end="406" line_begin="25" type="class" line_end="37" offset_begin="266" />
+                                                    <data />
+                                                    <subregions>
+                                                        <subregion>
+                                                            <info cursor="27" name="embeded" offset_end="402" line_begin="27" type="function" line_end="36" offset_begin="287" />
+                                                            <data>
+                                                                <std.code.complexity cyclomatic="2">
+                                                                    <__diff__ cyclomatic="1" />
+                                                                </std.code.complexity>
+                                                            </data>
+                                                            <subregions>
+                                                            </subregions>
+                                                        </subregion>
+                                                    </subregions>
+                                                </subregion>
+                                            </subregions>
+                                        </subregion>
+                                        <subregion>
+                                            <info cursor="41" name="never" offset_end="514" line_begin="41" type="function" line_end="48" offset_begin="423" />
+                                            <data>
+                                                <std.code.complexity cyclomatic="1">
+                                                    <__diff__ cyclomatic="0" />
+                                                </std.code.complexity>
+                                            </data>
+                                            <subregions>
+                                            </subregions>
+                                        </subregion>
+                                        <subregion>
+                                            <info cursor="50" name="new_func" offset_end="550" line_begin="50" type="function" line_end="53" offset_begin="517" />
+                                            <data>
+                                                <std.code.complexity cyclomatic="0" />
+                                            </data>
+                                            <subregions>
+                                            </subregions>
+                                        </subregion>
+                                        <subregion>
+                                            <info cursor="55" name="new_func_complex" offset_end="611" line_begin="55" type="function" line_end="59" offset_begin="553" />
+                                            <data>
+                                                <std.code.complexity cyclomatic="1" />
+                                            </data>
+                                            <subregions>
+                                            </subregions>
+                                        </subregion>
+                                    </subregions>
+                                </subregion>
+                            </subregions>
+                        </subregion>
+                    </subregions>
+                </region>
+            </regions>
+        </file-data>
+        <subfiles>
+        </subfiles>
+        <subdirs>
+        </subdirs>
+        <aggregated-data>
+            <std.code.complexity>
+                <cyclomatic max="3" total="8.0" avg="1.33333333333" min="0">
+                    <__diff__ max="0" total="2.0" avg="-0.166666666667" min="-1" />
+                </cyclomatic>
+            </std.code.complexity>
+            <std.code.cpp>
+                <mismatched_brackets max="None" total="0.0" avg="None" min="None">
+                    <__diff__ max="0" total="0.0" avg="0" min="0" />
+                </mismatched_brackets>
+            </std.code.cpp>
+        </aggregated-data>
+    </data>
+</export>

+ 24 - 0
mainline/tests/general/test_basic/test_export_format_export_nest_stdout.gold.txt

@@ -0,0 +1,24 @@
+<export>
+
+    <data>
+        <info path="" id="1" />
+        <file-data />
+        <subfiles>
+        </subfiles>
+        <subdirs>
+            <subdir>.</subdir>
+        </subdirs>
+        <aggregated-data>
+            <std.code.complexity>
+                <cyclomatic max="3" total="11.0" avg="1.57142857143" min="0">
+                    <__diff__ max="0" total="5.0" avg="0.0714285714286" min="-1" />
+                </cyclomatic>
+            </std.code.complexity>
+            <std.code.cpp>
+                <mismatched_brackets max="None" total="0.0" avg="None" min="None">
+                    <__diff__ max="0" total="0.0" avg="0" min="0" />
+                </mismatched_brackets>
+            </std.code.cpp>
+        </aggregated-data>
+    </data>
+</export>

+ 4 - 0
mainline/tests/general/test_basic/test_help_export_default_stdout.gold.txt

@@ -27,3 +27,7 @@ Options:
                         be processed. Separate several namespaces by comma,
                         for example 'general,std.code.complexity' [default:
                         none]
+  --general.nest-regions
+                        If the option is set (True), data for regions is
+                        exported in the form of a tree. Otherwise, all regions
+                        are exported in plain list. [default: False]

+ 1 - 1
mainline/tests/general/test_basic/test_workflow_collect_default_stderr.gold.txt

@@ -2,4 +2,4 @@
 [LOG]: INFO:	Excluding: ./.unused.cpp
 [LOG]: INFO:	Skipping: ./dummy.txt
 [LOG]: INFO:	Processing: ./simple.cpp
-[LOG]: WARNING:	Exit code: 0. Time spent: 0.12 seconds. Done
+[LOG]: WARNING:	Exit code: 0. Time spent: 0.11 seconds. Done

+ 1 - 1
mainline/tests/general/test_basic/test_workflow_export_default_stderr.gold.txt

@@ -1,3 +1,3 @@
 [LOG]: WARNING:	Logging enabled with INFO level
 [LOG]: INFO:	Processing: 
-[LOG]: WARNING:	Exit code: 0. Time spent: 0.01 seconds. Done
+[LOG]: WARNING:	Exit code: 0. Time spent: 0.0 seconds. Done