From 9bcdda5b1e63f2087727cc6a962fa1155f7f25dc Mon Sep 17 00:00:00 2001 From: kevin-orlando <58826693+kevin-orlando@users.noreply.github.com> Date: Thu, 7 Mar 2024 11:10:33 -0500 Subject: [PATCH] chore: move common service and action models into shared models (#472) secureli-440 secureli-441 closes #440 #441 Moves commonly used action and service models into shared models folder ## Changes * Move action models * Move service models * Remove unused action+service models ## Testing * ## Clean Code Checklist - [ ] Meets acceptance criteria for issue - [ ] New logic is covered with automated tests - [ ] Appropriate exception handling added - [ ] Thoughtful logging included - [ ] Documentation is updated - [ ] Follow-up work is documented in TODOs - [ ] TODOs have a ticket associated with them - [ ] No commented-out code included --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Isaac Heist Co-authored-by: Jordan Heffernan <44213782+JordoHeffernan@users.noreply.github.com> Co-authored-by: github-actions Co-authored-by: Kathleen Hogan <56691584+kathleen-hogan-slalom@users.noreply.github.com> Co-authored-by: Kathleen Hogan --- secureli/actions/action.py | 37 ++-------- secureli/actions/build.py | 2 +- secureli/actions/initializer.py | 5 +- secureli/actions/scan.py | 7 +- secureli/actions/setup.py | 2 +- secureli/actions/update.py | 2 +- secureli/main.py | 4 +- .../modules/core/core_services/scanner.py | 34 +--------- .../language_analyzer.py | 23 +------ .../language_config.py | 33 ++------- .../language_support.py | 67 +------------------ .../observability_services/logging.py | 13 +--- secureli/modules/shared/consts/__init__.py | 0 secureli/modules/shared/consts/language.py | 11 +++ secureli/modules/shared/models/__init__.py | 0 secureli/modules/shared/models/config.py | 30 +++++++++ secureli/modules/shared/models/install.py | 28 ++++++++ secureli/modules/shared/models/language.py | 53 +++++++++++++++ secureli/modules/shared/models/logging.py | 11 +++ secureli/modules/shared/models/scan.py | 33 +++++++++ .../modules/shared/utilities/usage_stats.py | 5 +- tests/actions/conftest.py | 7 +- tests/actions/test_action.py | 16 ++--- tests/actions/test_initializer_action.py | 9 +-- tests/actions/test_scan_action.py | 11 ++- tests/application/test_main.py | 4 +- tests/modules/core/test_scanner_service.py | 2 +- .../language_analyzer/test_language_config.py | 2 + .../test_language_support.py | 5 +- .../observability/test_logging_service.py | 6 +- .../shared/utilities/test_usage_stats.py | 8 +-- 31 files changed, 230 insertions(+), 240 deletions(-) create mode 100644 secureli/modules/shared/consts/__init__.py create mode 100644 secureli/modules/shared/consts/language.py create mode 100644 secureli/modules/shared/models/__init__.py create mode 100644 secureli/modules/shared/models/config.py create mode 100644 secureli/modules/shared/models/install.py create mode 100644 secureli/modules/shared/models/language.py create mode 100644 secureli/modules/shared/models/logging.py create mode 100644 secureli/modules/shared/models/scan.py diff --git a/secureli/actions/action.py b/secureli/actions/action.py index 04752955..731a5c90 100644 --- a/secureli/actions/action.py +++ b/secureli/actions/action.py @@ -1,10 +1,14 @@ from abc import ABC -from enum import Enum from pathlib import Path -from typing import Optional from secureli.modules.shared.abstractions.echo import EchoAbstraction from secureli.modules.observability.consts.logging import TELEMETRY_DEFAULT_ENDPOINT from secureli.modules.shared.models.echo import Color +from secureli.modules.shared.models.install import VerifyOutcome, VerifyResult +from secureli.modules.shared.models.language import ( + LanguageMetadata, + LanguageNotSupportedError, +) +from secureli.modules.shared.models.scan import ScanMode from secureli.repositories.secureli_config import ( SecureliConfig, SecureliConfigRepository, @@ -13,43 +17,16 @@ from secureli.repositories.settings import SecureliRepository, TelemetrySettings from secureli.modules.language_analyzer.language_analyzer_services.language_analyzer import ( LanguageAnalyzerService, - AnalyzeResult, -) -from secureli.modules.language_analyzer.language_analyzer_services.language_config import ( - LanguageNotSupportedError, ) from secureli.modules.language_analyzer.language_analyzer_services.language_support import ( - LanguageMetadata, LanguageSupportService, ) -from secureli.modules.core.core_services.scanner import ScannerService, ScanMode +from secureli.modules.core.core_services.scanner import ScannerService from secureli.modules.core.core_services.updater import UpdaterService -import pydantic from secureli.modules.shared.utilities.formatter import format_sentence_list -class VerifyOutcome(str, Enum): - INSTALL_CANCELED = "install-canceled" - INSTALL_FAILED = "install-failed" - INSTALL_SUCCEEDED = "install-succeeded" - UPDATE_CANCELED = "update-canceled" - UPDATE_SUCCEEDED = "update-succeeded" - UPDATE_FAILED = "update-failed" - UP_TO_DATE = "up-to-date" - - -class VerifyResult(pydantic.BaseModel): - """ - The outcomes of performing verification. Actions can use these results - to decide whether to proceed with their post-initialization actions or not. - """ - - outcome: VerifyOutcome - config: Optional[SecureliConfig] = None - analyze_result: Optional[AnalyzeResult] = None - - class ActionDependencies: """ Consolidates a growing set of common dependencies so Action adopters can diff --git a/secureli/actions/build.py b/secureli/actions/build.py index 2db72aa0..3288a82c 100644 --- a/secureli/actions/build.py +++ b/secureli/actions/build.py @@ -1,8 +1,8 @@ from secureli.modules.shared.abstractions.echo import EchoAbstraction, Color from secureli.modules.observability.observability_services.logging import ( LoggingService, - LogAction, ) +from secureli.modules.shared.models.logging import LogAction class BuildAction: diff --git a/secureli/actions/initializer.py b/secureli/actions/initializer.py index a6853581..dc8777b2 100644 --- a/secureli/actions/initializer.py +++ b/secureli/actions/initializer.py @@ -1,11 +1,12 @@ from pathlib import Path from secureli.actions.scan import ScanAction -from secureli.actions.action import Action, ActionDependencies, VerifyResult +from secureli.actions.action import Action, ActionDependencies from secureli.modules.observability.observability_services.logging import ( LoggingService, - LogAction, ) +from secureli.modules.shared.models.install import VerifyResult +from secureli.modules.shared.models.logging import LogAction class InitializerAction(Action): diff --git a/secureli/actions/scan.py b/secureli/actions/scan.py index 2ad1f4b6..ac6ffb37 100644 --- a/secureli/actions/scan.py +++ b/secureli/actions/scan.py @@ -6,22 +6,21 @@ from secureli.modules.shared.abstractions.echo import EchoAbstraction from secureli.actions.action import ( - VerifyOutcome, Action, ActionDependencies, - VerifyResult, ) from secureli.modules.shared.models.exit_codes import ExitCode +from secureli.modules.shared.models.install import VerifyOutcome, VerifyResult +from secureli.modules.shared.models.logging import LogAction from secureli.modules.shared.models.publish_results import PublishResultsOption from secureli.modules.shared.models.result import Result from secureli.modules.observability.observability_services.logging import ( LoggingService, - LogAction, ) from secureli.modules.core.core_services.scanner import ( - ScanMode, ScannerService, ) +from secureli.modules.shared.models.scan import ScanMode from secureli.settings import Settings from secureli.modules.shared.utilities.usage_stats import ( post_log, diff --git a/secureli/actions/setup.py b/secureli/actions/setup.py index 00326b2d..fde2601d 100644 --- a/secureli/actions/setup.py +++ b/secureli/actions/setup.py @@ -1,6 +1,6 @@ import jinja2 -from secureli.modules.language_analyzer.language_analyzer_services.language_support import ( +from secureli.modules.shared.consts.language import ( supported_languages, ) diff --git a/secureli/actions/update.py b/secureli/actions/update.py index f3e98887..4be195d0 100644 --- a/secureli/actions/update.py +++ b/secureli/actions/update.py @@ -3,12 +3,12 @@ from secureli.modules.shared.abstractions.echo import EchoAbstraction from secureli.modules.observability.observability_services.logging import ( LoggingService, - LogAction, ) from secureli.modules.core.core_services.updater import UpdaterService from secureli.actions.action import Action, ActionDependencies from rich.progress import Progress +from secureli.modules.shared.models.logging import LogAction class UpdateAction(Action): diff --git a/secureli/main.py b/secureli/main.py index ffc1545e..907ebb09 100644 --- a/secureli/main.py +++ b/secureli/main.py @@ -3,13 +3,13 @@ from typing_extensions import Annotated import typer from typer import Option -from secureli.actions.action import VerifyOutcome -from secureli.actions.scan import ScanMode from secureli.actions.setup import SetupAction from secureli.container import Container from secureli.modules.shared.models.echo import Color +from secureli.modules.shared.models.install import VerifyOutcome from secureli.modules.shared.models.publish_results import PublishResultsOption +from secureli.modules.shared.models.scan import ScanMode from secureli.modules.shared.resources import read_resource from secureli.settings import Settings import secureli.repositories.secureli_config as SecureliConfig diff --git a/secureli/modules/core/core_services/scanner.py b/secureli/modules/core/core_services/scanner.py index 3c5bea0c..00a5755d 100644 --- a/secureli/modules/core/core_services/scanner.py +++ b/secureli/modules/core/core_services/scanner.py @@ -6,18 +6,10 @@ import re from secureli.modules.shared.abstractions.pre_commit import PreCommitAbstraction +from secureli.modules.shared.models.scan import ScanFailure, ScanMode, ScanResult from secureli.repositories.settings import PreCommitSettings -class ScanMode(str, Enum): - """ - Which scan mode to run as when we perform scanning. - """ - - STAGED_ONLY = "staged-only" - ALL_FILES = "all-files" - - class OutputParseErrors(str, Enum): """ Possible errors when parsing scan output @@ -26,32 +18,12 @@ class OutputParseErrors(str, Enum): REPO_NOT_FOUND = "repo-not-found" -class Failure(pydantic.BaseModel): - """ - Represents the details of a failed rule from a scan - """ - - repo: str - id: str - file: str - - -class ScanResult(pydantic.BaseModel): - """ - The results of calling scan_repo - """ - - successful: bool - output: Optional[str] = None - failures: list[Failure] - - class ScanOuput(pydantic.BaseModel): """ Represents the parsed output from a scan """ - failures: list[Failure] + failures: list[ScanFailure] class ScannerService: @@ -128,7 +100,7 @@ def _parse_scan_ouput(self, folder_path: Path, output: str = "") -> ScanOuput: files = self._find_file_names(failure_output_list=failure_output_list) for file in files: - failures.append(Failure(id=id, file=file, repo=repo)) + failures.append(ScanFailure(id=id, file=file, repo=repo)) return ScanOuput(failures=failures) diff --git a/secureli/modules/language_analyzer/language_analyzer_services/language_analyzer.py b/secureli/modules/language_analyzer/language_analyzer_services/language_analyzer.py index 57786247..8112b80d 100644 --- a/secureli/modules/language_analyzer/language_analyzer_services/language_analyzer.py +++ b/secureli/modules/language_analyzer/language_analyzer_services/language_analyzer.py @@ -1,33 +1,14 @@ from collections import defaultdict from pathlib import Path -import pydantic - from secureli.modules.shared.abstractions.lexer_guesser import LexerGuesser +from secureli.modules.shared.models.language import AnalyzeResult, SkippedFile from secureli.repositories.repo_files import RepoFilesRepository -from secureli.modules.language_analyzer.language_analyzer_services.language_support import ( +from secureli.modules.shared.consts.language import ( supported_languages, ) -class SkippedFile(pydantic.BaseModel): - """ - A file skipped by the analysis phase. - """ - - file_path: Path - error_message: str - - -class AnalyzeResult(pydantic.BaseModel): - """ - The result of the analysis phase. - """ - - language_proportions: dict[str, float] - skipped_files: list[SkippedFile] - - class LanguageAnalyzerService: """ Analyzes a repository's visible files to determine which language seCureLI is targeting. diff --git a/secureli/modules/language_analyzer/language_analyzer_services/language_config.py b/secureli/modules/language_analyzer/language_analyzer_services/language_config.py index fe21a696..acea46e7 100644 --- a/secureli/modules/language_analyzer/language_analyzer_services/language_config.py +++ b/secureli/modules/language_analyzer/language_analyzer_services/language_config.py @@ -1,38 +1,17 @@ from pathlib import Path -from typing import Callable, Any - -import pydantic +from typing import Callable import yaml +from secureli.modules.shared.models.language import ( + LanguageNotSupportedError, + LanguagePreCommitResult, + LoadLinterConfigsResult, +) from secureli.modules.shared.resources.slugify import slugify from secureli.modules.shared.utilities.hash import hash_config from secureli.modules.shared.utilities.patterns import combine_patterns -class LanguageNotSupportedError(Exception): - """The given language was not supported by the PreCommitHooks abstraction""" - - pass - - -class LoadLinterConfigsResult(pydantic.BaseModel): - """Results from finding and loading any pre-commit configs for the language""" - - successful: bool - linter_data: list[Any] - - -class LanguagePreCommitResult(pydantic.BaseModel): - """ - A configuration model for a supported pre-commit-configurable language. - """ - - language: str - config_data: str - version: str - linter_config: LoadLinterConfigsResult - - class LanguageConfigService: def __init__( self, diff --git a/secureli/modules/language_analyzer/language_analyzer_services/language_support.py b/secureli/modules/language_analyzer/language_analyzer_services/language_support.py index cdb81039..c7ce424f 100644 --- a/secureli/modules/language_analyzer/language_analyzer_services/language_support.py +++ b/secureli/modules/language_analyzer/language_analyzer_services/language_support.py @@ -3,7 +3,8 @@ import pydantic import yaml -from secureli.modules.shared.abstractions.echo import EchoAbstraction +from secureli.modules.shared.models.config import HookConfiguration, LinterConfig, Repo +from secureli.modules.shared.models.language import LanguageMetadata import secureli.repositories.secureli_config as SecureliConfig from secureli.modules.shared.abstractions.pre_commit import PreCommitAbstraction @@ -16,70 +17,6 @@ ) from secureli.modules.shared.utilities.hash import hash_config -supported_languages = [ - "C#", - "Python", - "Java", - "Terraform", - "TypeScript", - "JavaScript", - "Go", - "Swift", - "Kotlin", -] - - -class LanguageMetadata(pydantic.BaseModel): - version: str - security_hook_id: Optional[str] - linter_config_write_errors: Optional[list[str]] = [] - - -class ValidateConfigResult(pydantic.BaseModel): - """ - The results of calling validate_config - """ - - successful: bool - output: str - - -class Repo(pydantic.BaseModel): - """A repository containing pre-commit hooks""" - - repo: str - revision: str - hooks: list[str] - - -class HookConfiguration(pydantic.BaseModel): - """A simplified pre-commit configuration representation for logging purposes""" - - repos: list[Repo] - - -class UnexpectedReposResult(pydantic.BaseModel): - """ - The result of checking for unexpected repos in config - """ - - missing_repos: Optional[list[str]] = [] - unexpected_repos: Optional[list[str]] = [] - - -class LinterConfigData(pydantic.BaseModel): - """ - Represents the structure of a linter config file - """ - - filename: str - settings: Any - - -class LinterConfig(pydantic.BaseModel): - language: str - linter_data: list[LinterConfigData] - class BuildConfigResult(pydantic.BaseModel): """Result about building config for all laguages""" diff --git a/secureli/modules/observability/observability_services/logging.py b/secureli/modules/observability/observability_services/logging.py index db6a8044..4d3d5070 100644 --- a/secureli/modules/observability/observability_services/logging.py +++ b/secureli/modules/observability/observability_services/logging.py @@ -6,11 +6,12 @@ from uuid import uuid4 import pydantic +from secureli.modules.shared.models.config import HookConfiguration +from secureli.modules.shared.models.logging import LogAction import secureli.repositories.secureli_config as SecureliConfig from secureli.modules.language_analyzer.language_analyzer_services.language_support import ( LanguageSupportService, - HookConfiguration, ) from secureli.repositories.secureli_config import SecureliConfigRepository from secureli.modules.shared.utilities.git_meta import ( @@ -37,16 +38,6 @@ class LogStatus(str, Enum): failure = "FAILURE" -class LogAction(str, Enum): - """Which action the log entry is associated with""" - - scan = "SCAN" - init = "INIT" - build = "_BUILD" - update = "UPDATE" - publish = "PUBLISH" # "PUBLISH" does not correspond to a CLI action/subcommand - - class LogFailure(pydantic.BaseModel): """An extendable structure for log failures""" diff --git a/secureli/modules/shared/consts/__init__.py b/secureli/modules/shared/consts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/secureli/modules/shared/consts/language.py b/secureli/modules/shared/consts/language.py new file mode 100644 index 00000000..5527489e --- /dev/null +++ b/secureli/modules/shared/consts/language.py @@ -0,0 +1,11 @@ +supported_languages = [ + "C#", + "Python", + "Java", + "Terraform", + "TypeScript", + "JavaScript", + "Go", + "Swift", + "Kotlin", +] diff --git a/secureli/modules/shared/models/__init__.py b/secureli/modules/shared/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/secureli/modules/shared/models/config.py b/secureli/modules/shared/models/config.py new file mode 100644 index 00000000..3d0d70a3 --- /dev/null +++ b/secureli/modules/shared/models/config.py @@ -0,0 +1,30 @@ +from typing import Any +import pydantic + + +class Repo(pydantic.BaseModel): + """A repository containing pre-commit hooks""" + + repo: str + revision: str + hooks: list[str] + + +class HookConfiguration(pydantic.BaseModel): + """A simplified pre-commit configuration representation for logging purposes""" + + repos: list[Repo] + + +class LinterConfigData(pydantic.BaseModel): + """ + Represents the structure of a linter config file + """ + + filename: str + settings: Any + + +class LinterConfig(pydantic.BaseModel): + language: str + linter_data: list[LinterConfigData] diff --git a/secureli/modules/shared/models/install.py b/secureli/modules/shared/models/install.py new file mode 100644 index 00000000..43abffd8 --- /dev/null +++ b/secureli/modules/shared/models/install.py @@ -0,0 +1,28 @@ +from enum import Enum +from typing import Optional + +import pydantic +from secureli.modules.shared.models.language import AnalyzeResult + +from secureli.repositories.secureli_config import SecureliConfig + + +class VerifyOutcome(str, Enum): + INSTALL_CANCELED = "install-canceled" + INSTALL_FAILED = "install-failed" + INSTALL_SUCCEEDED = "install-succeeded" + UPDATE_CANCELED = "update-canceled" + UPDATE_SUCCEEDED = "update-succeeded" + UPDATE_FAILED = "update-failed" + UP_TO_DATE = "up-to-date" + + +class VerifyResult(pydantic.BaseModel): + """ + The outcomes of performing verification. Actions can use these results + to decide whether to proceed with their post-initialization actions or not. + """ + + outcome: VerifyOutcome + config: Optional[SecureliConfig] = None + analyze_result: Optional[AnalyzeResult] = None diff --git a/secureli/modules/shared/models/language.py b/secureli/modules/shared/models/language.py new file mode 100644 index 00000000..886854ef --- /dev/null +++ b/secureli/modules/shared/models/language.py @@ -0,0 +1,53 @@ +from pathlib import Path +from typing import Any, Optional +import pydantic + +from secureli.modules.shared.models.config import LinterConfig + + +class SkippedFile(pydantic.BaseModel): + """ + A file skipped by the analysis phase. + """ + + file_path: Path + error_message: str + + +class AnalyzeResult(pydantic.BaseModel): + """ + The result of the analysis phase. + """ + + language_proportions: dict[str, float] + skipped_files: list[SkippedFile] + + +class LanguageNotSupportedError(Exception): + """The given language was not supported by the PreCommitHooks abstraction""" + + pass + + +class LoadLinterConfigsResult(pydantic.BaseModel): + """Results from finding and loading any pre-commit configs for the language""" + + successful: bool + linter_data: list[Any] + + +class LanguagePreCommitResult(pydantic.BaseModel): + """ + A configuration model for a supported pre-commit-configurable language. + """ + + language: str + config_data: str + version: str + linter_config: LoadLinterConfigsResult + + +class LanguageMetadata(pydantic.BaseModel): + version: str + security_hook_id: Optional[str] + linter_config_write_errors: Optional[list[str]] = [] diff --git a/secureli/modules/shared/models/logging.py b/secureli/modules/shared/models/logging.py new file mode 100644 index 00000000..1594b305 --- /dev/null +++ b/secureli/modules/shared/models/logging.py @@ -0,0 +1,11 @@ +from enum import Enum + + +class LogAction(str, Enum): + """Which action the log entry is associated with""" + + scan = "SCAN" + init = "INIT" + build = "_BUILD" + update = "UPDATE" + publish = "PUBLISH" # "PUBLISH" does not correspond to a CLI action/subcommand diff --git a/secureli/modules/shared/models/scan.py b/secureli/modules/shared/models/scan.py new file mode 100644 index 00000000..21edcc92 --- /dev/null +++ b/secureli/modules/shared/models/scan.py @@ -0,0 +1,33 @@ +from enum import Enum +from typing import Optional + +import pydantic + + +class ScanMode(str, Enum): + """ + Which scan mode to run as when we perform scanning. + """ + + STAGED_ONLY = "staged-only" + ALL_FILES = "all-files" + + +class ScanFailure(pydantic.BaseModel): + """ + Represents the details of a failed rule from a scan + """ + + repo: str + id: str + file: str + + +class ScanResult(pydantic.BaseModel): + """ + The results of calling scan_repo + """ + + successful: bool + output: Optional[str] = None + failures: list[ScanFailure] diff --git a/secureli/modules/shared/utilities/usage_stats.py b/secureli/modules/shared/utilities/usage_stats.py index a4df24cf..aa285661 100644 --- a/secureli/modules/shared/utilities/usage_stats.py +++ b/secureli/modules/shared/utilities/usage_stats.py @@ -6,14 +6,13 @@ ) from secureli.modules.shared.models.publish_results import PublishLogResult from secureli.modules.shared.models.result import Result - -from secureli.modules.core.core_services.scanner import Failure from collections import Counter +from secureli.modules.shared.models.scan import ScanFailure from secureli.settings import Settings -def convert_failures_to_failure_count(failure_list: list[Failure]): +def convert_failures_to_failure_count(failure_list: list[ScanFailure]): """ Convert a list of Failure ids to a list of individual failure count with underscore naming convention :param failure_list: a list of Failure Object diff --git a/tests/actions/conftest.py b/tests/actions/conftest.py index e59336c5..208458bb 100644 --- a/tests/actions/conftest.py +++ b/tests/actions/conftest.py @@ -2,12 +2,7 @@ import pytest -from secureli.modules.language_analyzer.language_analyzer_services.language_analyzer import ( - AnalyzeResult, -) -from secureli.modules.language_analyzer.language_analyzer_services.language_support import ( - LanguageMetadata, -) +from secureli.modules.shared.models.language import AnalyzeResult, LanguageMetadata # Register generic mocks you'd like available for every test. diff --git a/tests/actions/test_action.py b/tests/actions/test_action.py index e2eb8f06..b0c63f95 100644 --- a/tests/actions/test_action.py +++ b/tests/actions/test_action.py @@ -4,20 +4,18 @@ import pytest from secureli.modules.shared.abstractions.pre_commit import InstallResult -from secureli.actions.action import Action, ActionDependencies, VerifyOutcome +from secureli.actions.action import Action, ActionDependencies from secureli.modules.observability.consts.logging import TELEMETRY_DEFAULT_ENDPOINT from secureli.modules.shared.models.echo import Color -from secureli.repositories.secureli_config import SecureliConfig, VerifyConfigOutcome -from secureli.modules.language_analyzer.language_analyzer_services.language_analyzer import ( +from secureli.modules.shared.models.install import VerifyOutcome +from secureli.modules.shared.models.language import ( AnalyzeResult, - SkippedFile, -) -from secureli.modules.language_analyzer.language_analyzer_services.language_support import ( LanguageMetadata, + SkippedFile, ) -from secureli.modules.core.core_services.scanner import ScanResult, Failure +from secureli.modules.shared.models.scan import ScanFailure, ScanResult +from secureli.repositories.secureli_config import SecureliConfig, VerifyConfigOutcome from secureli.modules.core.core_services.updater import UpdateResult -from secureli.settings import Settings test_folder_path = Path("does-not-matter") @@ -122,7 +120,7 @@ def test_that_initialize_repo_install_flow_displays_security_analysis_results( mock_scanner.scan_repo.return_value = ScanResult( successful=False, output="Detect secrets...Failed", - failures=[Failure(repo="repo", id="id", file="file")], + failures=[ScanFailure(repo="repo", id="id", file="file")], ) action.verify_install(test_folder_path, reset=True, always_yes=True) diff --git a/tests/actions/test_initializer_action.py b/tests/actions/test_initializer_action.py index b38432c9..00e9e93c 100644 --- a/tests/actions/test_initializer_action.py +++ b/tests/actions/test_initializer_action.py @@ -5,13 +5,8 @@ from secureli.actions.action import ActionDependencies from secureli.actions.initializer import InitializerAction -from secureli.repositories.secureli_config import SecureliConfig -from secureli.repositories.settings import SecureliFile, TelemetrySettings -from secureli.modules.language_analyzer.language_analyzer_services.language_config import ( - LanguageNotSupportedError, -) -from secureli.modules.observability.observability_services.logging import LogAction -from secureli.settings import Settings +from secureli.modules.shared.models.language import LanguageNotSupportedError +from secureli.modules.shared.models.logging import LogAction test_folder_path = Path("does-not-matter") diff --git a/tests/actions/test_scan_action.py b/tests/actions/test_scan_action.py index fb885de1..c1ddc301 100644 --- a/tests/actions/test_scan_action.py +++ b/tests/actions/test_scan_action.py @@ -1,10 +1,14 @@ from pathlib import Path from secureli.modules.shared.abstractions.pre_commit import RevisionPair -from secureli.actions.action import ActionDependencies, VerifyOutcome +from secureli.actions.action import ActionDependencies from secureli.actions.scan import ScanAction from secureli.modules.shared.models.exit_codes import ExitCode +from secureli.modules.shared.models.install import VerifyOutcome +from secureli.modules.shared.models.language import AnalyzeResult +from secureli.modules.shared.models.logging import LogAction from secureli.modules.shared.models.publish_results import PublishResultsOption from secureli.modules.shared.models.result import Result +from secureli.modules.shared.models.scan import ScanMode, ScanResult from secureli.repositories.secureli_config import SecureliConfig, VerifyConfigOutcome from secureli.repositories.settings import ( PreCommitHook, @@ -14,11 +18,6 @@ EchoSettings, EchoLevel, ) -from secureli.modules.language_analyzer.language_analyzer_services.language_analyzer import ( - AnalyzeResult, -) -from secureli.modules.observability.observability_services.logging import LogAction -from secureli.modules.core.core_services.scanner import ScanMode, ScanResult from unittest import mock from unittest.mock import MagicMock from pytest_mock import MockerFixture diff --git a/tests/application/test_main.py b/tests/application/test_main.py index fb3eabd2..dce9b001 100644 --- a/tests/application/test_main.py +++ b/tests/application/test_main.py @@ -4,12 +4,12 @@ import pytest from pytest_mock import MockerFixture -from secureli.actions.action import VerifyOutcome, VerifyResult import secureli.container import secureli.main +from secureli.modules.shared.models.install import VerifyOutcome, VerifyResult from secureli.modules.shared.models.publish_results import PublishResultsOption -from secureli.modules.core.core_services.scanner import ScanMode +from secureli.modules.shared.models.scan import ScanMode from secureli.modules.shared.utilities.secureli_meta import secureli_version diff --git a/tests/modules/core/test_scanner_service.py b/tests/modules/core/test_scanner_service.py index e1c5f3b3..a6c1391b 100644 --- a/tests/modules/core/test_scanner_service.py +++ b/tests/modules/core/test_scanner_service.py @@ -3,6 +3,7 @@ import pytest from secureli.modules.shared.abstractions.pre_commit import ExecuteResult +from secureli.modules.shared.models.scan import ScanMode from secureli.repositories.settings import ( PreCommitHook, PreCommitRepo, @@ -10,7 +11,6 @@ ) from secureli.modules.core.core_services.scanner import ( ScannerService, - ScanMode, OutputParseErrors, ) from pytest_mock import MockerFixture diff --git a/tests/modules/language_analyzer/test_language_config.py b/tests/modules/language_analyzer/test_language_config.py index e5504149..882ab2f3 100644 --- a/tests/modules/language_analyzer/test_language_config.py +++ b/tests/modules/language_analyzer/test_language_config.py @@ -4,6 +4,8 @@ from secureli.modules.language_analyzer.language_analyzer_services.language_config import ( LanguageConfigService, +) +from secureli.modules.shared.models.language import ( LanguageNotSupportedError, LoadLinterConfigsResult, ) diff --git a/tests/modules/language_analyzer/test_language_support.py b/tests/modules/language_analyzer/test_language_support.py index afa1607e..a04b6164 100644 --- a/tests/modules/language_analyzer/test_language_support.py +++ b/tests/modules/language_analyzer/test_language_support.py @@ -9,12 +9,13 @@ ) from secureli.modules.language_analyzer.language_analyzer_services.language_support import ( LanguageSupportService, - LinterConfig, - LinterConfigData, LinterConfigWriteResult, ) from secureli.modules.language_analyzer.language_analyzer_services.language_config import ( LanguageConfigService, +) +from secureli.modules.shared.models.config import LinterConfig, LinterConfigData +from secureli.modules.shared.models.language import ( LanguagePreCommitResult, LoadLinterConfigsResult, ) diff --git a/tests/modules/observability/test_logging_service.py b/tests/modules/observability/test_logging_service.py index 3f6328b7..d16270ae 100644 --- a/tests/modules/observability/test_logging_service.py +++ b/tests/modules/observability/test_logging_service.py @@ -3,14 +3,12 @@ import pytest from pytest_mock import MockerFixture +from secureli.modules.shared.models.config import HookConfiguration +from secureli.modules.shared.models.logging import LogAction from secureli.repositories.secureli_config import SecureliConfig from secureli.modules.observability.observability_services.logging import ( LoggingService, - LogAction, -) -from secureli.modules.language_analyzer.language_analyzer_services.language_support import ( - HookConfiguration, ) diff --git a/tests/modules/shared/utilities/test_usage_stats.py b/tests/modules/shared/utilities/test_usage_stats.py index 3a75a2b5..93da055c 100644 --- a/tests/modules/shared/utilities/test_usage_stats.py +++ b/tests/modules/shared/utilities/test_usage_stats.py @@ -4,13 +4,13 @@ ) from secureli.modules.shared.models.publish_results import PublishLogResult from secureli.modules.shared.models.result import Result +from secureli.modules.shared.models.scan import ScanFailure from secureli.repositories.settings import TelemetrySettings from secureli.settings import Settings from secureli.modules.shared.utilities.usage_stats import ( post_log, convert_failures_to_failure_count, ) -from secureli.modules.core.core_services.scanner import Failure from unittest import mock from unittest.mock import Mock, patch @@ -19,9 +19,9 @@ def test_that_convert_failures_to_failure_count_returns_correct_count(): list_of_failure = [ - Failure(id="testfailid1", file="testfile1", repo="testrepo1"), - Failure(id="testfailid1", file="testfile2", repo="testrepo1"), - Failure(id="testfailid2", file="testfile1", repo="testrepo1"), + ScanFailure(id="testfailid1", file="testfile1", repo="testrepo1"), + ScanFailure(id="testfailid1", file="testfile2", repo="testrepo1"), + ScanFailure(id="testfailid2", file="testfile1", repo="testrepo1"), ] result = convert_failures_to_failure_count(list_of_failure)