Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Move shared service model items to shared folder #469

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ repos:
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 24.1.1
rev: 24.2.0
hooks:
- id: black
- repo: https://github.com/yelp/detect-secrets
Expand Down
33 changes: 5 additions & 28 deletions secureli/actions/action.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from abc import ABC
from enum import Enum
from pathlib import Path
from typing import Optional
from secureli.abstractions.echo import EchoAbstraction
from secureli.consts.logging import TELEMETRY_DEFAULT_ENDPOINT
from secureli.models.echo import Color
Expand All @@ -11,40 +9,19 @@
VerifyConfigOutcome,
)
from secureli.repositories.settings import SecureliRepository, TelemetrySettings
from secureli.services.language_analyzer import LanguageAnalyzerService, AnalyzeResult
from secureli.services.language_config import LanguageNotSupportedError
from secureli.services.language_analyzer import LanguageAnalyzerService
from secureli.services.language_support import (
LanguageMetadata,
LanguageSupportService,
)
from secureli.services.scanner import ScannerService, ScanMode
from secureli.services.scanner import ScannerService
from secureli.services.updater import UpdaterService

import pydantic
from secureli.shared.models.actions import VerifyOutcome, VerifyResult
from secureli.shared.models.language import LanguageMetadata, LanguageNotSupportedError
from secureli.shared.models.scan import ScanMode
from secureli.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
Expand Down
3 changes: 2 additions & 1 deletion secureli/actions/build.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from secureli.abstractions.echo import EchoAbstraction, Color
from secureli.services.logging import LoggingService, LogAction
from secureli.services.logging import LoggingService
from secureli.shared.models.logging import LogAction


class BuildAction:
Expand Down
3 changes: 2 additions & 1 deletion secureli/actions/initializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

from secureli.actions.scan import ScanAction
from secureli.actions.action import Action, ActionDependencies, VerifyResult
from secureli.services.logging import LoggingService, LogAction
from secureli.services.logging import LoggingService
from secureli.shared.models.logging import LogAction


class InitializerAction(Action):
Expand Down
8 changes: 4 additions & 4 deletions secureli/actions/scan.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@

from secureli.abstractions.echo import EchoAbstraction
from secureli.actions.action import (
VerifyOutcome,
Action,
ActionDependencies,
VerifyResult,
)
from secureli.models.exit_codes import ExitCode
from secureli.models.publish_results import PublishResultsOption
from secureli.models.result import Result
from secureli.services.logging import LoggingService, LogAction
from secureli.services.logging import LoggingService
from secureli.services.scanner import (
ScanMode,
ScannerService,
)
from secureli.settings import Settings
from secureli.shared.models.actions import VerifyOutcome, VerifyResult
from secureli.shared.models.logging import LogAction
from secureli.shared.models.scan import ScanMode
from secureli.utilities.usage_stats import post_log, convert_failures_to_failure_count

ONE_WEEK_IN_SECONDS: int = 7 * 24 * 60 * 60
Expand Down
3 changes: 1 addition & 2 deletions secureli/actions/setup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import jinja2

from secureli.services.language_support import supported_languages
from secureli.shared.consts.language import supported_languages


class SetupAction:
Expand Down
3 changes: 2 additions & 1 deletion secureli/actions/update.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from typing import Optional
from pathlib import Path
from secureli.abstractions.echo import EchoAbstraction
from secureli.services.logging import LoggingService, LogAction
from secureli.services.logging import LoggingService
from secureli.services.updater import UpdaterService
from secureli.actions.action import Action, ActionDependencies
from secureli.shared.models.logging import LogAction


class UpdateAction(Action):
Expand Down
2 changes: 1 addition & 1 deletion secureli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
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.models.echo import Color
from secureli.models.publish_results import PublishResultsOption
from secureli.resources import read_resource
from secureli.settings import Settings
import secureli.repositories.secureli_config as SecureliConfig
from secureli.shared.models.scan import ScanMode
from secureli.utilities.secureli_meta import secureli_version

# Create SetupAction outside of DI, as it's not yet available.
Expand Down
23 changes: 2 additions & 21 deletions secureli/services/language_analyzer.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,10 @@
from collections import defaultdict
from pathlib import Path

import pydantic

from secureli.abstractions.lexer_guesser import LexerGuesser
from secureli.repositories.repo_files import RepoFilesRepository
from secureli.services.language_support 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]
from secureli.shared.consts.language import supported_languages
from secureli.shared.models.language import AnalyzeResult, SkippedFile


class LanguageAnalyzerService:
Expand Down
32 changes: 6 additions & 26 deletions secureli/services/language_config.py
Original file line number Diff line number Diff line change
@@ -1,38 +1,18 @@
from pathlib import Path
from typing import Callable, Any
from typing import Callable

import pydantic
import yaml

from secureli.resources.slugify import slugify
from secureli.shared.models.language import (
LanguageNotSupportedError,
LanguagePreCommitResult,
LoadLinterConfigsResult,
)
from secureli.utilities.hash import hash_config
from secureli.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,
Expand Down
89 changes: 6 additions & 83 deletions secureli/services/language_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,91 +10,14 @@
from secureli.resources.slugify import slugify
from secureli.services.git_ignore import GitIgnoreService
from secureli.services.language_config import LanguageConfigService
from secureli.shared.models.config import HookConfiguration, LinterConfig, Repo
from secureli.shared.models.language import (
BuildConfigResult,
LanguageMetadata,
LinterConfigWriteResult,
)
from secureli.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"""

successful: bool
languages_added: list[str]
config_data: dict
linter_configs: list[LinterConfig]
version: str


class LinterConfigWriteResult(pydantic.BaseModel):
"""
Result from writing linter config files
"""

successful_languages: list[str]
error_messages: list[str]


class LanguageSupportService:
"""
Expand Down
11 changes: 1 addition & 10 deletions secureli/services/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import secureli.repositories.secureli_config as SecureliConfig
from secureli.services.language_support import LanguageSupportService, HookConfiguration
from secureli.repositories.secureli_config import SecureliConfigRepository
from secureli.shared.models.logging import LogAction
from secureli.utilities.git_meta import current_branch_name, git_user_email, origin_url
from secureli.utilities.secureli_meta import secureli_version

Expand All @@ -30,16 +31,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"""

Expand Down
Loading
Loading