diff --git a/Makefile b/Makefile index 6d45987..17746ef 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -UTIL_VERSION := 0.5.6 +UTIL_VERSION := 0.5.7 UTIL_NAME := codeplag PWD := $(shell pwd) diff --git a/src/codeplag/handlers/check.py b/src/codeplag/handlers/check.py index 301eec9..0293281 100644 --- a/src/codeplag/handlers/check.py +++ b/src/codeplag/handlers/check.py @@ -29,7 +29,7 @@ from codeplag.getfeatures import AbstractGetter from codeplag.logger import codeplag_logger as logger from codeplag.pyplag.utils import PyFeaturesGetter -from codeplag.reporters import CSVReporter, JSONReporter +from codeplag.reporters import CSVReporter from codeplag.types import ( ASTFeatures, CompareInfo, @@ -92,7 +92,10 @@ def __init__( reports = settings_conf.get("reports") if reports is not None: reports_extension = settings_conf["reports_extension"] - Reporter = CSVReporter if reports_extension == "csv" else JSONReporter + if reports_extension == "csv": + Reporter = CSVReporter + else: + raise ValueError(f"Unsupported reports extension '{reports_extension}'.") self.reporter = Reporter(reports) else: self.reporter = None diff --git a/src/codeplag/reporters.py b/src/codeplag/reporters.py index 1d5263a..affb239 100644 --- a/src/codeplag/reporters.py +++ b/src/codeplag/reporters.py @@ -1,7 +1,6 @@ """This module contains logic for saving a comparison result into JSON or CSV.""" import json -import uuid from abc import ABC, abstractmethod from datetime import datetime from pathlib import Path @@ -11,7 +10,6 @@ import pandas as pd from typing_extensions import Self -from codeplag.config import write_config from codeplag.consts import CSV_REPORT_COLUMNS, CSV_REPORT_FILENAME, CSV_SAVE_TICK_SEC from codeplag.logger import codeplag_logger as logger from codeplag.types import ( @@ -19,7 +17,6 @@ CompareInfo, FastMetrics, StructuresInfo, - WorksReport, ) @@ -107,40 +104,6 @@ def get_compare_result_from_cache( return deserialize_compare_result(cache_val.iloc[0]) -# DEPRECATED -class JSONReporter(AbstractReporter): - def save_result( - self: Self, - first_work: ASTFeatures, - second_work: ASTFeatures, - compare_info: CompareInfo, - ) -> None: - if not self.reports.is_dir(): - logger.error("The folder for reports isn't exists.") - return - assert compare_info.structure is not None - - struct_info_dict = compare_info.structure._asdict() - struct_info_dict["compliance_matrix"] = struct_info_dict["compliance_matrix"].tolist() - report = WorksReport( - date=_get_current_date(), - first_path=first_work.filepath.__str__(), - first_modify_date=first_work.modify_date, - second_path=second_work.filepath.__str__(), - second_modify_date=second_work.modify_date, - first_heads=first_work.head_nodes, - second_heads=second_work.head_nodes, - fast=compare_info.fast._asdict(), - structure=struct_info_dict, - ) - - try: - report_file = self.reports / f"{uuid.uuid4().hex}.json" - write_config(report_file, report) - except PermissionError: - logger.error("Not enough rights to write reports to the folder.") - - def read_df(path: Path) -> pd.DataFrame: return pd.read_csv(path, sep=";", index_col=0, dtype=object) # type: ignore diff --git a/src/codeplag/types.py b/src/codeplag/types.py index e98c771..f0a9f16 100644 --- a/src/codeplag/types.py +++ b/src/codeplag/types.py @@ -21,7 +21,7 @@ Flag = Literal[0, 1] Mode = Literal["many_to_many", "one_to_one"] NgramsLength = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -ReportsExtension = Literal["json", "csv"] +ReportsExtension = Literal["csv"] ReportType = Literal["general", "sources"] Language = Literal["en", "ru"] LogLevel = Literal["debug", "info", "warning", "error"] @@ -130,19 +130,6 @@ class CompareInfo(NamedTuple): structure: StructuresInfo | None = None -# TODO: Rework it structure -class WorksReport(TypedDict): - date: str - first_path: str - second_path: str - first_modify_date: str - second_modify_date: str - first_heads: list[str] - second_heads: list[str] - fast: dict[str, int] # dict from FastMetrics - structure: dict # dict from StructuresInfo - - # Exceptions # ---------------------------------------------------------------------------- diff --git a/test/auto/functional/test_check.py b/test/auto/functional/test_check.py index 7cdb671..16b5f14 100644 --- a/test/auto/functional/test_check.py +++ b/test/auto/functional/test_check.py @@ -1,15 +1,11 @@ from __future__ import annotations -import json import os -import re import pytest -from const import REPORTS_FOLDER from utils import modify_settings, run_check, run_util from codeplag.consts import CONFIG_PATH, UTIL_NAME, UTIL_VERSION -from codeplag.types import WorksReport CWD = os.getcwd() CPP_FILES = [ @@ -145,23 +141,3 @@ def test_check_failed_when_path_regexp_provided_without_required_args( result.assert_failed() assert result.cmd_res.returncode == 2 - - -def test_save_reports(create_reports_folder: None): - modify_settings(reports=REPORTS_FOLDER, reports_extension="json").assert_success() - run_check( - [ - "--directories", - "./src", - ] - ).assert_success() - reports_files = os.listdir(REPORTS_FOLDER) - - assert len(reports_files) > 0 - for file in reports_files: - assert re.search(".*[.]json$", file) - filepath = f"{REPORTS_FOLDER}/{file}" - with open(filepath, "r") as f: - report = json.loads(f.read()) - for key in set(WorksReport.__annotations__.keys()): - assert key in report diff --git a/test/auto/functional/test_settings.py b/test/auto/functional/test_settings.py index f103ef6..11e9643 100644 --- a/test/auto/functional/test_settings.py +++ b/test/auto/functional/test_settings.py @@ -23,9 +23,9 @@ class TestSettingsModify: @pytest.mark.parametrize( "env,reports,threshold,ngrams_length,show_progress,reports_extension,language,log_level,workers", [ - (f"src/{UTIL_NAME}/types.py", "src", 83, 2, 0, "json", "en", "debug", 1), + (f"src/{UTIL_NAME}/types.py", "src", 83, 2, 0, "csv", "en", "debug", 1), ("setup.py", "test", 67, 3, 1, "csv", "ru", "info", os.cpu_count() or 1), - (f"src/{UTIL_NAME}/utils.py", "debian", 93, 4, 0, "json", "en", "warning", 1), + (f"src/{UTIL_NAME}/utils.py", "debian", 93, 4, 0, "csv", "en", "warning", 1), ], ) def test_modify_settings( diff --git a/test/unit/codeplag/test_reporters.py b/test/unit/codeplag/test_reporters.py index bf9fb3a..5e0a52a 100644 --- a/test/unit/codeplag/test_reporters.py +++ b/test/unit/codeplag/test_reporters.py @@ -1,5 +1,5 @@ from pathlib import Path -from unittest.mock import MagicMock, call +from unittest.mock import MagicMock import pandas as pd import pytest @@ -8,11 +8,10 @@ from codeplag.consts import CSV_REPORT_COLUMNS, CSV_REPORT_FILENAME from codeplag.handlers.report import deserialize_compare_result -from codeplag.reporters import CSVReporter, JSONReporter +from codeplag.reporters import CSVReporter from codeplag.types import ( ASTFeatures, CompareInfo, - WorksReport, ) @@ -26,49 +25,6 @@ def mock_write_config(mocker: MockerFixture) -> MagicMock: return mocker.patch("codeplag.reporters.write_config") -class TestJSONReporter: - REPORTER = JSONReporter(Path(".")) - - def test_save_result_not_occurred_due_absent_dir( - self: Self, - mock_default_logger: MagicMock, - first_features: ASTFeatures, - second_features: ASTFeatures, - first_compare_result: CompareInfo, - ) -> None: - self.REPORTER.reports = Path("/bad_directory") - self.REPORTER.save_result(first_features, second_features, first_compare_result) - assert mock_default_logger.error.call_args == call("The folder for reports isn't exists.") - - def test_save_result_not_occurred_due_permission_error( - self: Self, - mocker: MockerFixture, - mock_default_logger: MagicMock, - first_features: ASTFeatures, - second_features: ASTFeatures, - first_compare_result: CompareInfo, - ) -> None: - mocker.patch.object(Path, "open", side_effect=PermissionError) - self.REPORTER.reports = Path("/etc") - self.REPORTER.save_result(first_features, second_features, first_compare_result) - Path.open.assert_called_once() - assert mock_default_logger.error.call_args == call( - "Not enough rights to write reports to the folder." - ) - - def test_save_result_with_modify_date( - self: Self, - mock_write_config: MagicMock, - first_features: ASTFeatures, - second_features: ASTFeatures, - first_compare_result: CompareInfo, - ) -> None: - mock_write_config.reset_mock() - self.REPORTER.save_result(first_features, second_features, first_compare_result) - mock_write_config.assert_called_once() - assert mock_write_config.call_args[0][1].keys() == WorksReport.__annotations__.keys() - - class TestCSVReporter: REPORTER = CSVReporter(Path("./src"))