From 30c7f874b1dbbcb364e1fd519b77da684e0ffe91 Mon Sep 17 00:00:00 2001 From: Kilka0s0Tomatami Date: Mon, 6 Apr 2026 00:51:08 +0300 Subject: [PATCH 1/3] add functionality to restore reports --- src/codeplag/codeplagcli.py | 10 +++++----- src/codeplag/config.py | 20 ++++++++++---------- src/codeplag/handlers/settings.py | 11 +++++++++-- src/codeplag/types.py | 4 ++-- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/codeplag/codeplagcli.py b/src/codeplag/codeplagcli.py index 3b0d7a5..3697f0d 100644 --- a/src/codeplag/codeplagcli.py +++ b/src/codeplag/codeplagcli.py @@ -124,10 +124,10 @@ def __add_settings_path(self: Self, subparsers: argparse._SubParsersAction) -> N help=_( "If defined, then saves reports about suspect works into provided file or " "directory. If directory by provided path doesn't exists than saves reports " - "as a file." + "as a file. Pass empty string to disable saving reports." ), metavar="PATH", - type=Path, + type=str, ) settings_modify.add_argument( "-re", @@ -440,14 +440,14 @@ def validate_args(self: Self, parsed_args: argparse.Namespace) -> None: elif root == "check": if parsed_args.repo_regexp and not parsed_args.github_user: self.error( - _("The 'repo-regexp' option requires the provided 'github-user' option.") + _("The'repo-regexp' option requires the provided 'github-user' option.") ) elif parsed_args.path_regexp and not ( parsed_args.directories or parsed_args.github_user or parsed_args.github_urls ): self.error( _( - "The 'path-regexp' option requires the provided 'directories', " + "The'path-regexp' option requires the provided 'directories', " "'github-user', or 'github-urls' options." ) ) @@ -462,4 +462,4 @@ def validate_args(self: Self, parsed_args: argparse.Namespace) -> None: def parse_args(self: Self, args: Sequence[str] | None = None) -> argparse.Namespace: # pyright: ignore[reportIncompatibleMethodOverride] parsed_args = super(CodeplagCLI, self).parse_args(args) self.validate_args(parsed_args) - return parsed_args + return parsed_args \ No newline at end of file diff --git a/src/codeplag/config.py b/src/codeplag/config.py index a8b5011..6139413 100644 --- a/src/codeplag/config.py +++ b/src/codeplag/config.py @@ -41,7 +41,6 @@ def read_config(file: Path, safe: bool = False) -> Config | None: return config -# TODO: Handle permission denied def write_config(file: Path, config: Mapping[str, Any]) -> None: config_for_dump = dict(config) for key in config_for_dump: @@ -67,16 +66,17 @@ def read_settings_conf() -> Settings: loaded_settings_config[key] = DefaultSettingsConfig[key] continue - if key in ["environment", "reports"]: + if key in ["environment", "reports"] and loaded_settings_config.get(key) is not None: loaded_settings_config[key] = Path(loaded_settings_config[key]) - return Settings( - **{ - key: loaded_settings_config[key] - for key in Settings.__annotations__ - if key in loaded_settings_config - } - ) + settings_dict = {} + for key in Settings.__annotations__: + if key in loaded_settings_config and loaded_settings_config[key] is not None: + settings_dict[key] = loaded_settings_config[key] + elif key in DefaultSettingsConfig: + settings_dict[key] = DefaultSettingsConfig[key] + + return Settings(**settings_dict) def write_settings_conf(settings: Settings) -> None: @@ -96,4 +96,4 @@ def write_settings_conf(settings: Settings) -> None: mongo_host=DEFAULT_MONGO_HOST, mongo_port=DEFAULT_MONGO_PORT, mongo_user=DEFAULT_MONGO_USER, -) +) \ No newline at end of file diff --git a/src/codeplag/handlers/settings.py b/src/codeplag/handlers/settings.py index fa38c8e..850b68b 100644 --- a/src/codeplag/handlers/settings.py +++ b/src/codeplag/handlers/settings.py @@ -26,9 +26,16 @@ def settings_modify(parsed_args: dict[str, Any]) -> None: new_value = parsed_args.get(key) if new_value is None: continue - if isinstance(new_value, Path): + if key == "reports": + if new_value == "": + if "reports" in settings_config: + del settings_config["reports"] + continue + else: + settings_config[key] = Path(new_value).resolve() + elif isinstance(new_value, Path): settings_config[key] = new_value.resolve() else: settings_config[key] = new_value - write_settings_conf(settings_config) + write_settings_conf(settings_config) \ No newline at end of file diff --git a/src/codeplag/types.py b/src/codeplag/types.py index 1357605..79ab2a6 100644 --- a/src/codeplag/types.py +++ b/src/codeplag/types.py @@ -201,7 +201,7 @@ class Settings(TypedDict): environment: NotRequired[Path] language: Language log_level: LogLevel - reports: NotRequired[Path] + reports: NotRequired[Path | None] reports_extension: ReportsExtension show_progress: Flag short_output: ShortOutput @@ -242,4 +242,4 @@ class ProcessingWorks(NamedTuple): NodeStructurePlace.__module__ = __name__ FastCompareInfo.__module__ = __name__ StructureCompareInfo.__module__ = __name__ -FullCompareInfo.__module__ = __name__ +FullCompareInfo.__module__ = __name__ \ No newline at end of file From e0827f25f65adfcc5b423209bb8beb4d80545a55 Mon Sep 17 00:00:00 2001 From: Kilka0s0Tomatami Date: Mon, 6 Apr 2026 02:53:04 +0300 Subject: [PATCH 2/3] fix --- src/codeplag/handlers/settings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/codeplag/handlers/settings.py b/src/codeplag/handlers/settings.py index 850b68b..9b16739 100644 --- a/src/codeplag/handlers/settings.py +++ b/src/codeplag/handlers/settings.py @@ -26,8 +26,10 @@ def settings_modify(parsed_args: dict[str, Any]) -> None: new_value = parsed_args.get(key) if new_value is None: continue + if key == "reports": - if new_value == "": + str_value = str(new_value) if new_value is not None else "" + if str_value in ["", "."]: if "reports" in settings_config: del settings_config["reports"] continue From fafd06fd14fd8e86952112e7accd7c1173051f62 Mon Sep 17 00:00:00 2001 From: Kilka0s0Tomatami Date: Mon, 6 Apr 2026 03:28:39 +0300 Subject: [PATCH 3/3] fix --- src/codeplag/codeplagcli.py | 4 ++-- src/codeplag/config.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/codeplag/codeplagcli.py b/src/codeplag/codeplagcli.py index 3697f0d..1ed2a11 100644 --- a/src/codeplag/codeplagcli.py +++ b/src/codeplag/codeplagcli.py @@ -440,14 +440,14 @@ def validate_args(self: Self, parsed_args: argparse.Namespace) -> None: elif root == "check": if parsed_args.repo_regexp and not parsed_args.github_user: self.error( - _("The'repo-regexp' option requires the provided 'github-user' option.") + _("The 'repo-regexp' option requires the provided 'github-user' option.") ) elif parsed_args.path_regexp and not ( parsed_args.directories or parsed_args.github_user or parsed_args.github_urls ): self.error( _( - "The'path-regexp' option requires the provided 'directories', " + "The 'path-regexp' option requires the provided 'directories', " "'github-user', or 'github-urls' options." ) ) diff --git a/src/codeplag/config.py b/src/codeplag/config.py index 6139413..8fb1a87 100644 --- a/src/codeplag/config.py +++ b/src/codeplag/config.py @@ -41,6 +41,7 @@ def read_config(file: Path, safe: bool = False) -> Config | None: return config +# TODO: Handle permission denied def write_config(file: Path, config: Mapping[str, Any]) -> None: config_for_dump = dict(config) for key in config_for_dump: