sync from local backup
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
import difflib
|
||||
from rest_framework.decorators import permission_classes
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from rest_framework.permissions import AllowAny
|
||||
|
||||
|
||||
@permission_classes([AllowAny])
|
||||
class TextDiffView(APIView):
|
||||
def post(self, request):
|
||||
text_a = request.data.get('text_a')
|
||||
text_b = request.data.get('text_b')
|
||||
|
||||
if text_a is None or text_b is None:
|
||||
return Response(
|
||||
{'error': 'text_a and text_b are required'},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
|
||||
lines_a = text_a.splitlines()
|
||||
lines_b = text_b.splitlines()
|
||||
|
||||
diff_result = list(difflib.ndiff(lines_a, lines_b))
|
||||
|
||||
diff_lines = []
|
||||
line_a = 0
|
||||
line_b = 0
|
||||
added_count = 0
|
||||
removed_count = 0
|
||||
unchanged_count = 0
|
||||
|
||||
for line in diff_result:
|
||||
if line.startswith('? '):
|
||||
continue
|
||||
elif line.startswith('+ '):
|
||||
line_b += 1
|
||||
added_count += 1
|
||||
diff_lines.append({
|
||||
'line_number_a': None,
|
||||
'line_number_b': line_b,
|
||||
'type': 'added',
|
||||
'content': line[2:],
|
||||
})
|
||||
elif line.startswith('- '):
|
||||
line_a += 1
|
||||
removed_count += 1
|
||||
diff_lines.append({
|
||||
'line_number_a': line_a,
|
||||
'line_number_b': None,
|
||||
'type': 'removed',
|
||||
'content': line[2:],
|
||||
})
|
||||
elif line.startswith(' '):
|
||||
line_a += 1
|
||||
line_b += 1
|
||||
unchanged_count += 1
|
||||
diff_lines.append({
|
||||
'line_number_a': line_a,
|
||||
'line_number_b': line_b,
|
||||
'type': 'unchanged',
|
||||
'content': line[2:],
|
||||
})
|
||||
|
||||
stats = {
|
||||
'added_count': added_count,
|
||||
'removed_count': removed_count,
|
||||
'unchanged_count': unchanged_count,
|
||||
'total_lines': len(diff_lines),
|
||||
}
|
||||
|
||||
return Response(
|
||||
{
|
||||
'diff_lines': diff_lines,
|
||||
'stats': stats,
|
||||
'text_a_lines': len(lines_a),
|
||||
'text_b_lines': len(lines_b),
|
||||
},
|
||||
status=status.HTTP_200_OK,
|
||||
)
|
||||
Reference in New Issue
Block a user