Skip to content

Commit

Permalink
feat(sql): Add sql language support
Browse files Browse the repository at this point in the history
feat(sql): Add sql language support

feat(sql): Add sql language support

feat(sql): Add sql language support

feat(sql): Add sql language support
  • Loading branch information
its-sushant committed Jan 4, 2022
1 parent 4a2a494 commit fe9b44b
Show file tree
Hide file tree
Showing 5 changed files with 224 additions and 1 deletion.
1 change: 1 addition & 0 deletions nirjas/languages/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"scala",
"scss",
"shell",
"sql",
"swift",
"text",
"typescript",
Expand Down
106 changes: 106 additions & 0 deletions nirjas/languages/sql.py
Original file line number Diff line number Diff line change
@@ -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
113 changes: 113 additions & 0 deletions nirjas/languages/tests/test_sql.py
Original file line number Diff line number Diff line change
@@ -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"""(?<!["'`])\-\-\s*(.*)"""
syntax_start = "/*"
syntax_end = "*/"
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_outputFormat(self):
"""
Check for the output format correctness.
"""
regex = r"""(?<!["'`])\-\-\s*(.*)"""
syntax_start = "/*"
syntax_end = "*/"
expected = sql.sqlExtractor(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": "SQL",
"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_Source(self):
"""
Test the source code extraction.
Call the source function and check if new file exists.
"""
name = "source.txt"
newfile = sql.sqlSource(self.testfile, name)

self.assertTrue(newfile)
2 changes: 2 additions & 0 deletions nirjas/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ class LanguageMapper:
".rb": "ruby",
".rs": "rust",
".sh": "shell",
".sql": "sql",
".swift": "swift",
".scala": "scala",
".sc": "scala",
Expand Down Expand Up @@ -152,6 +153,7 @@ def scan_the_file(file):
"""
langname = LanguageMapper.langIdentifier(file)
func = langname + "." + langname + "Extractor"

return eval(func)(file)


Expand Down
3 changes: 2 additions & 1 deletion testScript.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ def download_files(cwd):
"https://raw.githubusercontent.com/airbnb/react-with-styles/2532394bb866aaade4dc750ee94c0ff213d9b6de/src/withStyles.jsx",
"https://raw.githubusercontent.com/flutter/plugins/e61e9d45bcaadc3e409d529d30735cb4db75c5c5/packages/android_alarm_manager/lib/android_alarm_manager.dart",
"https://raw.githubusercontent.com/microsoft/TypeScript/c33a14d66d0a452673ce77256e178bf84e875d2b/tests/cases/user/formik/index.tsx",
"https://raw.githubusercontent.com/twbs/bootstrap/9488978fb55286ba83e8193a871d1ff9815045b9/scss/_reboot.scss"
"https://raw.githubusercontent.com/twbs/bootstrap/9488978fb55286ba83e8193a871d1ff9815045b9/scss/_reboot.scss",
"https://raw.githubusercontent.com/its-sushant/SQL/a4bf2972905c8df89d6a60752a2c60920a4b9465/check.sql"
]

directory = os.path.join(cwd, "nirjas/languages/tests/TestFiles")
Expand Down

0 comments on commit fe9b44b

Please sign in to comment.