Skip to content

Проверка на плагиат с помощью MOSS #10

@markpolyak

Description

@markpolyak

Цель

Реализовать модуль, который запускает проверку на плагиат с использованием сервиса MOSS (через библиотеку mosspy), парсит результаты и обновляет Google Таблицу, где хранятся оценки студентов.

Требования

Задание на 3

  • Написать скрипт, который:
    • Загружает index.html с отчётом MOSS по заранее предоставленной ссылке.
    • Извлекает из него пары совпадающих студентов, проценты и количество совпавших строк.
    • Сохраняет результат в results.json (см. ниже).

Задание на 4

Реализовать:

  • Запуск проверки через pymoss.
  • Скачивание index.html.
  • Парсинг совпадений.
  • Обновление Google-таблицы:
    • В нужной ячейке в строке студента создать комментарий с текстом "подозрение на плагиат" в столбце соответствующем лабораторной работе. Если комментарий (-ии) к этой ячейке уже есть, добавить новый комментарий в конец существующей ветки комментариев. Обязательно пометить ячейку залив ее желтым цветом.
    • В столбец "Заимствования" добавить текст вроде "Плагиат ЛР2: совпадение с petrov21 (89%)."

Задание на 5

Помимо задания на 4 дополнительно реализовать два или более пунктов:

  • Использование порога (например, игнорировать совпадения < 50%).
  • Предусмотреть возможность подгрузки в moss результатов выполнения лабораторных работ студентами прошлых лет. Предполагается, что исходный код студентов предыдущих курсов хранится локально, скачивать его из гитхаба не нужно. В случае, если будет найден плагиат между двумя репозиториями студентов прошлых лет - игнорировать. Если плагиат между студентом прошлых лет и нынешним - оставить комментарий и раскрасить ячейку (см. выше) для нынешнего студента, а информацию о студенте одного из прошлых потоков игнорировать, т.к. этого студента нет в текущей гугл-таблице.
  • Поддержка compare50 в виде альтернативного движка для проверки на плагиат.
  • Добавление ссылки на локальный HTML-отчёт, скачанный с помощью pymoss.

Архитектура

Использовать шаблон «Стратегия».
Определить абстрактный интерфейс PlagiarismChecker и создать реализацию для MossChecker.

Пример (перечень входных и выходных аргументов можно менять):

from abc import ABC, abstractmethod

class PlagiarismChecker(ABC):
    def __init__(self, lab_id: str, language: str):
        self.lab_id = lab_id
        self.language = language

    @abstractmethod
    def run_check(self) -> str:
        """Запускает проверку, возвращает путь к отчёту"""

    @abstractmethod
    def parse_results(self, report_path: str) -> list[dict]:
        """Извлекает пары совпадений"""

Содержимое results.json, который должен генерироваться в случае выполнения задания на 3:

[
  {
    "student1": "ivanov-dev",
    "student2": "petrov21",
    "match1": "89%",
    "match2": "87%",
    "lines": 56,
    "lab_id": "ЛР2"
  },
  {
    "student1": "sidorov-a",
    "student2": "ivanov-dev",
    "match1": "65%",
    "match2": "64%",
    "lines": 33,
    "lab_id": "ЛР2"
  }
]

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions