diff --git a/nirjas/languages/__init__.py b/nirjas/languages/__init__.py index 25a15a8..2d25b83 100644 --- a/nirjas/languages/__init__.py +++ b/nirjas/languages/__init__.py @@ -46,4 +46,5 @@ "swift", "text", "typescript", + "julia", ] diff --git a/nirjas/languages/julia.py b/nirjas/languages/julia.py new file mode 100644 index 0000000..e132533 --- /dev/null +++ b/nirjas/languages/julia.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Copyright (C) 2020 Soham Banerjee (sohambanerjee4abc@hotmail.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 juliaExtractor(file): + """ + Extract comments from julia file. + :param file: File to scan + :type file: string + :return: Scan output + :rtype: ScanOutput + """ + result = CommentSyntax() + single_line_comment = result.hash(file) + multiline_single_comment = result.singleQuotes(file) + multiline_double_comment = result.doubleQuotes(file) + cont_single_line_comment = contSingleLines(single_line_comment) + file = file.split("/") + output = ScanOutput() + output.filename = file[-1] + output.lang = "Julia" + output.total_lines = single_line_comment[1] + output.total_lines_of_comments = ( + single_line_comment[3] + multiline_single_comment[3] + multiline_double_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_single_comment[0]): + output.multi_line_comment.append( + MultiLine( + multiline_single_comment[0][idx], + multiline_single_comment[1][idx], + multiline_single_comment[2][idx], + ) + ) + except BaseException: + pass + + try: + for idx, _ in enumerate(multiline_double_comment[0]): + output.multi_line_comment.append( + MultiLine( + multiline_double_comment[0][idx], + multiline_double_comment[1][idx], + multiline_double_comment[2][idx], + ) + ) + except BaseException: + pass + + return output + + +def juliaSource(file, new_file: str): + """ + Extract source from Julia 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: + if copy: + pos = line.find('"""') + content = line[:pos].rstrip() + line = line[pos:] + copy = False + found = True + else: + content = content + line[line.rfind('"""') + 3:] + line = content + copy = True + found = True + if "'''" in line: + if copy: + pos = line.find("'''") + content = line[:pos].rstrip() + line = line[pos:] + copy = False + found = True + else: + content = content + line[line.rfind("'''") + 3:] + 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_julia.py b/nirjas/languages/tests/test_julia.py new file mode 100644 index 0000000..aac2272 --- /dev/null +++ b/nirjas/languages/tests/test_julia.py @@ -0,0 +1,131 @@ +#!/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 julia +from nirjas.binder import readSingleLine, readMultiLineSame, contSingleLines + + +class JuliaTest(unittest.TestCase): + """ + Test cases for Julia language. + :ivar testfile: Location of test file + """ + + testfile = os.path.join( + os.path.abspath(os.path.dirname(__file__)), "TestFiles/textcomment.jl" + ) + + def test_output(self): + """ + Check for the scan correctness. + """ + regex = r"""(?