def shellExtractor(file): """ Extract comments from Shell file. :param file: File to scan :type file: string :return: Scan output :rtype: ScanOutput """ result = CommentSyntax() single_line_comment = result.hash(file) cont_single_line_comment = contSingleLines(single_line_comment) file = file.split("/") output = ScanOutput() output.filename = file[-1] output.lang = "Shell" output.total_lines = single_line_comment[1] output.total_lines_of_comments = single_line_comment[3] output.blank_lines = single_line_comment[2] if cont_single_line_comment: single_line_comment = cont_single_line_comment[0] for i in single_line_comment[0]: output.single_line_comment.append(SingleLine(i[0], i[1])) for idx, _ in enumerate(cont_single_line_comment[1]): output.cont_single_line_comment.append( MultiLine( cont_single_line_comment[1][idx], cont_single_line_comment[2][idx], cont_single_line_comment[3][idx], )) return output
def test_outputFormat(self): """ Check for the output format correctness. """ regex = r"""(?<!["'`])#+\s*(.*)""" syntax_start = "=begin" syntax_end = "=cut" expected = perl.perlExtractor(self.testfile).get_dict() comment_single = readSingleLine(self.testfile, regex) comment_multiline = readMultiLineDiff(self.testfile, syntax_start, syntax_end) comment_contSingleline = contSingleLines(comment_single) file = self.testfile.split("/") output = { "metadata": { "filename": file[-1], "lang": "Perl", "total_lines": comment_single[1], "total_lines_of_comments": comment_single[3] + comment_multiline[3], "blank_lines": comment_single[2], "sloc": comment_single[1] - (comment_single[3] + comment_multiline[3] + comment_single[2]), }, "single_line_comment": [], "cont_single_line_comment": [], "multi_line_comment": [], } if comment_contSingleline: comment_single = comment_contSingleline[0] if comment_single: for i in comment_single[0]: output["single_line_comment"].append( {"line_number": i[0], "comment": i[1]} ) if comment_contSingleline: for idx, _ in enumerate(comment_contSingleline[1]): output["cont_single_line_comment"].append( { "start_line": comment_contSingleline[1][idx], "end_line": comment_contSingleline[2][idx], "comment": comment_contSingleline[3][idx], } ) if comment_multiline: for idx, _ in enumerate(comment_multiline[0]): output["multi_line_comment"].append( { "start_line": comment_multiline[0][idx], "end_line": comment_multiline[1][idx], "comment": comment_multiline[2][idx], } ) self.assertEqual(output, expected)
def test_output(self): """ Check for the scan correctness. """ regex = r"""(?<!["'`])#+\s*(.*)""" syntax_start = "=begin" syntax_end = "=cut" comment_single = readSingleLine(self.testfile, regex) comment_multiline = readMultiLineDiff(self.testfile, syntax_start, syntax_end) comment_contSingleline = contSingleLines(comment_single) self.assertTrue(comment_single) self.assertTrue(comment_multiline) self.assertTrue(comment_contSingleline)
def test_output(self): """ Check for the scan correctness. """ regex = r"""(?<![pst'"`]:)\/\/\s*(.*)""" syntax_start = "/*" syntax_end = "*/" comment_single = readSingleLine(self.testfile, regex) comment_multiline = readMultiLineDiff(self.testfile, syntax_start, syntax_end) comment_contSinglelines = contSingleLines(comment_single) self.assertTrue(comment_single) self.assertTrue(comment_multiline) self.assertTrue(comment_contSinglelines)
def test_output(self): """ Check for the scan correctness. """ regex = r"""(?<!["'`])#+\s*(.*)""" syntax_single = "'''" syntax_double = '"""' comment_multi_single = readMultiLineSame(self.testfile, syntax_single) comment_single = readSingleLine(self.testfile, regex) comment_multi_double = readMultiLineSame(self.testfile, syntax_double) comment_contSingleline = contSingleLines(comment_single) self.assertTrue(comment_single) self.assertTrue(comment_multi_single) self.assertTrue(comment_multi_double) self.assertTrue(comment_contSingleline)
def cExtractor(file): """ Extract comments from C file. :param file: File to scan :type file: string :return: Scan output :rtype: ScanOutput """ result = CommentSyntax() single_line_comment = result.doubleSlash(file) multiline_comment = result.slashStar(file) cont_single_line_comment = contSingleLines(single_line_comment) file = file.split("/") output = ScanOutput() output.filename = file[-1] output.lang = "C" output.total_lines = single_line_comment[1] output.total_lines_of_comments = single_line_comment[ 3] + multiline_comment[3] output.blank_lines = single_line_comment[2] if cont_single_line_comment: single_line_comment = cont_single_line_comment[0] for i in single_line_comment[0]: output.single_line_comment.append(SingleLine(i[0], i[1])) for idx, _ in enumerate(cont_single_line_comment[1]): output.cont_single_line_comment.append( MultiLine( cont_single_line_comment[1][idx], cont_single_line_comment[2][idx], cont_single_line_comment[3][idx], )) try: for idx, _ in enumerate(multiline_comment[0]): output.multi_line_comment.append( MultiLine( multiline_comment[0][idx], multiline_comment[1][idx], multiline_comment[2][idx], )) except BaseException: pass return output
def matlabExtractor(file): """ Extract comments from MATLAB file. :param file: File to scan :type file: string :return: Scan output :rtype: ScanOutput """ result = CommentSyntax() single_line_comment = result.percentage(file) multiline_comment = result.percentageCurlybraces(file) cont_single_line_comment = contSingleLines(single_line_comment) file = file.split("/") output = ScanOutput() output.filename = file[-1] output.lang = "MATLAB" output.total_lines = single_line_comment[1] output.total_lines_of_comments = single_line_comment[3] + multiline_comment[3] output.blank_lines = single_line_comment[2] if cont_single_line_comment: single_line_comment = cont_single_line_comment[0] for i in single_line_comment[0]: output.single_line_comment.append(SingleLine(i[0], i[1])) for idx, _ in enumerate(cont_single_line_comment[1]): output.cont_single_line_comment.append( MultiLine( cont_single_line_comment[1][idx], cont_single_line_comment[2][idx], cont_single_line_comment[3][idx], ) ) for idx, _ in enumerate(multiline_comment[0]): output.multi_line_comment.append( MultiLine( multiline_comment[0][idx], multiline_comment[1][idx], multiline_comment[2][idx], ) ) return output
def test_outputFormat(self): regex = r'''(\/\/\s*[\w #\.()@+-_*\d]*)''' self.syntax_start = "/*" self.syntax_end ='*/' sign = '//' expected = cpp.cppExtractor(self.testfile) comment_single = readSingleLine(self.testfile,regex,sign) comment_multiline = readMultiLineDiff(self.testfile,self.syntax_start,self.syntax_end) comment_contSingleline = contSingleLines(comment_single) file = self.testfile.split("/") output = { "metadata": [{ "filename": file[-1], "lang": "C++", "total_lines": comment_single[1], "total_lines_of_comments": comment_single[3]+comment_multiline[3], "blank_lines": comment_single[2], "sloc": comment_single[1]-(comment_single[3]+comment_multiline[3]+comment_single[2]) }], "single_line_comment": [], "cont_single_line_comment": [], "multi_line_comment": [] } if comment_contSingleline: comment_single = comment_contSingleline[0] if comment_single: for i in comment_single[0]: output['single_line_comment'].append({"line_number" :i[0],"comment": i[1]}) if comment_contSingleline: for idx,i in enumerate(comment_contSingleline[1]): output['cont_single_line_comment'].append({"start_line": comment_contSingleline[1][idx], "end_line": comment_contSingleline[2][idx], "comment": comment_contSingleline[3][idx]}) if comment_multiline: try: for idx,i in enumerate(comment_multiline[0]): output['multi_line_comment'].append({"start_line": comment_multiline[0][idx], "end_line": comment_multiline[1][idx], "comment": comment_multiline[2][idx]}) except: pass self.assertEqual(output,expected)