11# -*- coding: utf-8 -*-
22import io
33import json
4+ import os
45import pickle
56import re
67
1011from django .db .models import QuerySet , Q
1112from django .http import HttpResponse
1213from django .utils .translation import gettext_lazy as _
14+ from pylint .lint import Run
15+ from pylint .reporters import JSON2Reporter
1316from rest_framework import serializers , status
1417
1518from common .db .search import page_search
1619from common .exception .app_exception import AppApiException
1720from common .result import result
1821from common .utils .tool_code import ToolExecutor
19- from maxkb .const import CONFIG
22+ from maxkb .const import CONFIG , PROJECT_DIR
2023from tools .models import Tool , ToolScope , ToolFolder
2124from tools .serializers .tool_folder import ToolFolderFlatSerializer
2225
@@ -36,6 +39,25 @@ def __init__(self, tool: dict, version: str):
3639}
3740
3841
42+ def to_dict (message , file_name ):
43+ return {
44+ 'line' : message .line ,
45+ 'column' : message .column ,
46+ 'endLine' : message .end_line ,
47+ 'endColumn' : message .end_column ,
48+ 'message' : (message .msg or "" ).replace (file_name , 'code' ),
49+ 'type' : message .category
50+ }
51+
52+
53+ def get_file_name ():
54+ file_name = f"{ uuid .uuid7 ()} "
55+ pylint_dir = os .path .join (PROJECT_DIR , 'data' , 'pylint' )
56+ if not os .path .exists (pylint_dir ):
57+ os .makedirs (pylint_dir )
58+ return os .path .join (pylint_dir , file_name )
59+
60+
3961class RestrictedUnpickler (pickle .Unpickler ):
4062
4163 def find_class (self , folder , name ):
@@ -164,6 +186,10 @@ class ToolDebugRequest(serializers.Serializer):
164186 debug_field_list = DebugField (required = True , many = True )
165187
166188
189+ class PylintInstance (serializers .Serializer ):
190+ code = serializers .CharField (required = True , allow_null = True , allow_blank = True , label = _ ('function content' ))
191+
192+
167193class ToolSerializer (serializers .Serializer ):
168194 class Create (serializers .Serializer ):
169195 user_id = serializers .UUIDField (required = True , label = _ ('user id' ))
@@ -287,6 +313,22 @@ def export(self):
287313 except Exception as e :
288314 return result .error (str (e ), response_status = status .HTTP_500_INTERNAL_SERVER_ERROR )
289315
316+ def pylint (self , instance , is_valid = True ):
317+ if is_valid :
318+ self .is_valid (raise_exception = True )
319+ PylintInstance (data = instance ).is_valid (raise_exception = True )
320+ code = instance .get ('code' )
321+ file_name = get_file_name ()
322+ with open (file_name , 'w' ) as file :
323+ file .write (code )
324+ reporter = JSON2Reporter ()
325+ Run ([file_name ,
326+ "--disable=line-too-long" ,
327+ '--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}' ],
328+ reporter = reporter , exit = False )
329+ os .remove (file_name )
330+ return [to_dict (m , os .path .basename (file_name )) for m in reporter .messages ]
331+
290332 class Import (serializers .Serializer ):
291333 file = UploadedFileField (required = True , label = _ ("file" ))
292334 user_id = serializers .UUIDField (required = True , label = _ ("User ID" ))
0 commit comments