diff --git a/nirjas/languages/__init__.py b/nirjas/languages/__init__.py index 9a25074..25a15a8 100644 --- a/nirjas/languages/__init__.py +++ b/nirjas/languages/__init__.py @@ -42,6 +42,7 @@ "scala", "scss", "shell", + "sql", "swift", "text", "typescript", diff --git a/nirjas/languages/sql.py b/nirjas/languages/sql.py new file mode 100644 index 0000000..b8c69c9 --- /dev/null +++ b/nirjas/languages/sql.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Copyright (C) Sushant Kumar (sushantmishra02102002@gmail.com) +SPDX-License-Identifier: LGPL-2.1 +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +""" + +from nirjas.binder import CommentSyntax, contSingleLines +from nirjas.output import ScanOutput, SingleLine, MultiLine + + +def sqlExtractor(file): + """ + Extract comments from sql file. + :param file: File to scan + :type file: string + :return: Scan output + :rtype: ScanOutput + """ + result = CommentSyntax() + single_line_comment = result.doubleDash(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 = "SQL" + 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 sqlSource(file, new_file: str): + """ + Extract source from sql file and put at new_file. + :param file: File to process + :type file: string + :param new_file: File to put source at + :type new_file: string + :return: Path to new file + :rtype: string + """ + copy = True + with open(new_file, "w+") as f1: + with open(file) as f: + for line in f: + content = "" + found = False + if "/*" in line: + pos = line.find("/*") + content = line[:pos].rstrip() + line = line[pos:] + copy = False + found = True + if "*/" in line: + content = content + line[line.rfind("*/") + 2:] + line = content + copy = True + found = True + if "--" in line: + content = line[: line.find("--")].rstrip() + "\n" + found = True + if not found: + content = line + if copy and content.strip() != "": + f1.write(content) + f.close() + f1.close() + return new_file diff --git a/nirjas/languages/tests/test_sql.py b/nirjas/languages/tests/test_sql.py new file mode 100644 index 0000000..5dfd970 --- /dev/null +++ b/nirjas/languages/tests/test_sql.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +SPDX-License-Identifier: LGPL-2.1 +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +""" + +import unittest +import os +from nirjas.languages import sql +from nirjas.binder import readSingleLine, readMultiLineDiff, contSingleLines + + +class sqlTest(unittest.TestCase): + """ + Test cases for sql language. + :ivar testfile: Location of test file + """ + + testfile = os.path.join( + os.path.abspath(os.path.dirname(__file__)), "TestFiles/textcomment.sql" + ) + + def test_output(self): + """ + Check for the scan correctness. + """ + regex = r"""(?