2024-10-08 08:58:46 +00:00
|
|
|
|
# coding=utf-8
|
|
|
|
|
|
"""
|
|
|
|
|
|
@project: MaxKB
|
|
|
|
|
|
@Author:虎
|
|
|
|
|
|
@file: py_lint_serializer.py
|
|
|
|
|
|
@date:2024/9/30 15:38
|
|
|
|
|
|
@desc:
|
|
|
|
|
|
"""
|
|
|
|
|
|
import os
|
|
|
|
|
|
import uuid
|
|
|
|
|
|
|
|
|
|
|
|
from pylint.lint import Run
|
|
|
|
|
|
from pylint.reporters import JSON2Reporter
|
|
|
|
|
|
from rest_framework import serializers
|
|
|
|
|
|
|
|
|
|
|
|
from common.util.field_message import ErrMessage
|
|
|
|
|
|
from smartdoc.const import PROJECT_DIR
|
2025-01-13 03:15:51 +00:00
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
2024-10-08 08:58:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PyLintInstance(serializers.Serializer):
|
2024-10-18 06:37:37 +00:00
|
|
|
|
code = serializers.CharField(required=True, allow_null=True, allow_blank=True,
|
2025-01-13 03:15:51 +00:00
|
|
|
|
error_messages=ErrMessage.char(_('function content')))
|
2024-10-08 08:58:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def to_dict(message, file_name):
|
|
|
|
|
|
return {'line': message.line,
|
|
|
|
|
|
'column': message.column,
|
|
|
|
|
|
'endLine': message.end_line,
|
|
|
|
|
|
'endColumn': message.end_column,
|
|
|
|
|
|
'message': (message.msg or "").replace(file_name, 'code'),
|
|
|
|
|
|
'type': message.category}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_file_name():
|
|
|
|
|
|
file_name = f"{uuid.uuid1()}"
|
|
|
|
|
|
py_lint_dir = os.path.join(PROJECT_DIR, 'data', 'py_lint')
|
|
|
|
|
|
if not os.path.exists(py_lint_dir):
|
|
|
|
|
|
os.makedirs(py_lint_dir)
|
|
|
|
|
|
return os.path.join(py_lint_dir, file_name)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PyLintSerializer(serializers.Serializer):
|
|
|
|
|
|
|
|
|
|
|
|
def pylint(self, instance, is_valid=True):
|
|
|
|
|
|
if is_valid:
|
|
|
|
|
|
self.is_valid(raise_exception=True)
|
|
|
|
|
|
PyLintInstance(data=instance).is_valid(raise_exception=True)
|
|
|
|
|
|
code = instance.get('code')
|
|
|
|
|
|
file_name = get_file_name()
|
|
|
|
|
|
with open(file_name, 'w') as file:
|
|
|
|
|
|
file.write(code)
|
|
|
|
|
|
reporter = JSON2Reporter()
|
|
|
|
|
|
Run([file_name,
|
|
|
|
|
|
"--disable=line-too-long",
|
|
|
|
|
|
'--module-rgx=[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'],
|
|
|
|
|
|
reporter=reporter, exit=False)
|
|
|
|
|
|
os.remove(file_name)
|
|
|
|
|
|
return [to_dict(m, os.path.basename(file_name)) for m in reporter.messages]
|