Skip to content

Feature/pylint config #12

New issue

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

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

Already on GitHub? # to your account

Merged
merged 2 commits into from
Nov 11, 2024
Merged
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
12 changes: 6 additions & 6 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -32,6 +32,23 @@ pylint = "^3.3.1"
[tool.poetry.scripts]
gitlab-watchman = "gitlab_watchman:main"

[tool.pylint.messages_control]
max-line-length = 120
max-attributes = 10
max-args = 10
disable = [
"missing-module-docstring",
"too-few-public-methods",
"arguments-differ",
"logging-fstring-interpolation",
"no-else-return",
"no-else-raise",
"inconsistent-return-statements",
"broad-exception-caught",
"duplicate-code",
]


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
2 changes: 2 additions & 0 deletions src/gitlab_watchman/__init__.py
Original file line number Diff line number Diff line change
@@ -116,6 +116,8 @@ def validate_variables() -> bool:
return True


# pylint: disable=too-many-locals, missing-function-docstring, global-variable-undefined
# pylint: disable=too-many-branches, disable=too-many-statements
def main():
global OUTPUT_LOGGER
try:
2 changes: 1 addition & 1 deletion src/gitlab_watchman/__main__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from . import main

main()
main()
1 change: 0 additions & 1 deletion src/gitlab_watchman/clients/gitlab_client.py
Original file line number Diff line number Diff line change
@@ -14,7 +14,6 @@
GitlabSearchError,
GitlabHttpError
)

from gitlab_watchman.exceptions import (
GitLabWatchmanAuthenticationError,
GitLabWatchmanGetObjectError,
3 changes: 1 addition & 2 deletions src/gitlab_watchman/exceptions.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
from typing import Dict, Any

class GitLabWatchmanError(Exception):
""" Base class for exceptions in GitLab Watchman.
"""


class ElasticsearchMissingError(GitLabWatchmanError):
""" Exception raised when Elasticsearch is not enabled on the instance.
"""
51 changes: 32 additions & 19 deletions src/gitlab_watchman/loggers.py
Original file line number Diff line number Diff line change
@@ -16,20 +16,28 @@


class StdoutLogger:
""" Class to log to stdout """
def __init__(self, **kwargs):
self.debug = kwargs.get('debug')
self.print_header()
init()

# pylint: disable=too-many-branches
def log(self,
mes_type: str,
msg_level: str,
message: Any,
**kwargs) -> None:
""" Log to stdout

Args:
msg_level: Level message to log
message: Message data to log
"""

notify_type = kwargs.get('notify_type')
scope = kwargs.get('scope')

if not self.debug and mes_type == 'DEBUG':
if not self.debug and msg_level == 'DEBUG':
return

if dataclasses.is_dataclass(message):
@@ -44,7 +52,7 @@ def log(self,
f' URL: {message.get("kas").get("externalUrl")} \n'\
f' VERSION: {message.get("kas").get("version")} \n' \
f' ENTERPRISE: {message.get("enterprise")}'
mes_type = 'INSTANCE'
msg_level = 'INSTANCE'
if notify_type == "user":
message = f'USER: \n' \
f' ID: {message.get("id")} \n' \
@@ -57,7 +65,7 @@ def log(self,
f' CAN_CREATE_GROUP: {message.get("can_create_group")} \n'\
f' CAN_CREATE_PROJECT: {message.get("can_create_project")} \n' \
f' 2FA_ENABLED: {message.get("two_factor_enabled")}'
mes_type = 'USER'
msg_level = 'USER'
if notify_type == "token":
message = f'PERSONAL_ACCESS_TOKEN: \n' \
f' ID: {message.get("id")} \n' \
@@ -68,7 +76,7 @@ def log(self,
f' LAST_USED_AT: {message.get("last_used_at")} \n' \
f' ACTIVE: {message.get("active")} \n'\
f' EXPIRY: {message.get("expires_at", "Never")}'
mes_type = 'WARNING'
msg_level = 'WARNING'
if notify_type == "result":
if scope == 'blobs':
message = 'SCOPE: Blob' \
@@ -145,12 +153,12 @@ def log(self,
f' URL: {message.get("snippet").get("web_url")} \n' \
f' POTENTIAL_SECRET: {message.get("match_string")} \n' \
f' -----'
mes_type = 'RESULT'
msg_level = 'RESULT'
try:
self.log_to_stdout(message, mes_type)
self.log_to_stdout(message, msg_level)
except Exception as e:
print(e)
self.log_to_stdout(message, mes_type)
self.log_to_stdout(message, msg_level)

def log_to_stdout(self,
message: Any,
@@ -236,7 +244,10 @@ def log_to_stdout(self,
sys.exit(1)
print('Formatting error')

def print_header(self) -> None:
@staticmethod
def print_header() -> None:
""" Prints the header for the logger"""

print(" ".ljust(79) + Style.BRIGHT)

print(Fore.LIGHTRED_EX + Style.BRIGHT +
@@ -265,6 +276,7 @@ def print_header(self) -> None:


class JSONLogger(Logger):
""" Custom logger class for JSON logging"""
def __init__(self, name: str = 'gitlab_watchman', **kwargs):
super().__init__(name)
self.notify_format = logging.Formatter(
@@ -290,41 +302,42 @@ def __init__(self, name: str = 'gitlab_watchman', **kwargs):

def log(self,
level: str,
log_data: str or Dict,
msg: str or Dict,
**kwargs):
if level.upper() == 'NOTIFY':
self.handler.setFormatter(self.notify_format)
self.logger.info(
json.dumps(
log_data,
msg,
cls=EnhancedJSONEncoder),
extra={
'scope': kwargs.get('scope', ''),
'type': kwargs.get('detect_type', ''),
'severity': kwargs.get('severity', '')})
elif level.upper() == 'INFO':
self.handler.setFormatter(self.info_format)
self.logger.info(json.dumps(log_data))
self.logger.info(json.dumps(msg))
elif level.upper() == 'DEBUG':
self.handler.setFormatter(self.info_format)
self.logger.info(json.dumps(log_data))
self.logger.info(json.dumps(msg))
elif level.upper() == 'SUCCESS':
self.handler.setFormatter(self.success_format)
self.logger.info(json.dumps(log_data))
self.logger.info(json.dumps(msg))
elif level.upper() == 'INSTANCE':
self.handler.setFormatter(self.instance_format)
self.logger.info(json.dumps(log_data))
self.logger.info(json.dumps(msg))
elif level.upper() == 'USER':
self.handler.setFormatter(self.user_format)
self.logger.info(json.dumps(log_data))
self.logger.info(json.dumps(msg))
elif level.upper() == 'TOKEN':
self.handler.setFormatter(self.token_format)
self.logger.info(json.dumps(log_data))
self.logger.info(json.dumps(msg))
else:
self.handler.setFormatter(self.info_format)
self.logger.critical(log_data)
self.logger.critical(msg)


# pylint: disable=missing-class-docstring
class IsDataclass(Protocol):
__dataclass_fields__: ClassVar[Dict]

@@ -360,4 +373,4 @@ def init_logger(logging_type: str, debug: bool) -> JSONLogger | StdoutLogger:

if not logging_type or logging_type == 'stdout':
return StdoutLogger(debug=debug)
return JSONLogger(debug=debug)
return JSONLogger(debug=debug)
2 changes: 1 addition & 1 deletion src/gitlab_watchman/models/blob.py
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@


@dataclass(slots=True)
class Blob(object):
class Blob:
""" Class that defines Blob objects for GitLab blobs"""

basename: str
3 changes: 2 additions & 1 deletion src/gitlab_watchman/models/commit.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,8 @@


@dataclass(slots=True)
class Commit(object):
# pylint: disable=too-many-instance-attributes
class Commit:
""" Class that defines File objects for GitLab files"""

id: str
2 changes: 1 addition & 1 deletion src/gitlab_watchman/models/file.py
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@


@dataclass(slots=True)
class File(object):
class File:
""" Class that defines File objects for GitLab files"""

file_name: str
3 changes: 2 additions & 1 deletion src/gitlab_watchman/models/group.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,8 @@


@dataclass(slots=True)
class Group(object):
# pylint: disable=too-many-instance-attributes
class Group:
""" Class that defines User objects for GitLab groups"""

id: str
3 changes: 2 additions & 1 deletion src/gitlab_watchman/models/issue.py
Original file line number Diff line number Diff line change
@@ -6,7 +6,8 @@


@dataclass(slots=True)
class Issue(object):
# pylint: disable=too-many-instance-attributes
class Issue:
""" Class that defines Issues objects for GitLab issues"""

id: str
3 changes: 2 additions & 1 deletion src/gitlab_watchman/models/merge_request.py
Original file line number Diff line number Diff line change
@@ -6,7 +6,8 @@


@dataclass(slots=True)
class MergeRequest(object):
# pylint: disable=too-many-instance-attributes
class MergeRequest:
""" Class that defines MergeRequest objects for GitLab merge requests"""

id: str
3 changes: 2 additions & 1 deletion src/gitlab_watchman/models/milestone.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,8 @@


@dataclass(slots=True)
class Milestone(object):
# pylint: disable=too-many-instance-attributes
class Milestone:
""" Class that defines Milestone objects for GitLab milestones"""

id: str
3 changes: 2 additions & 1 deletion src/gitlab_watchman/models/note.py
Original file line number Diff line number Diff line change
@@ -6,7 +6,8 @@


@dataclass(slots=True)
class Note(object):
# pylint: disable=too-many-instance-attributes
class Note:
""" Class that defines User objects for GitLab notes"""

id: str
5 changes: 3 additions & 2 deletions src/gitlab_watchman/models/project.py
Original file line number Diff line number Diff line change
@@ -7,7 +7,8 @@


@dataclass(slots=True)
class Namespace(object):
class Namespace:
""" Class that defines Namespace objects for GitLab Projects"""
id: str
name: str
path: str
@@ -20,7 +21,7 @@ class Namespace(object):


@dataclass(slots=True)
class Project(object):
class Project:
""" Class that defines User objects for GitLab projects"""

id: str
15 changes: 7 additions & 8 deletions src/gitlab_watchman/models/signature.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import datetime
from typing import Any, Dict
from typing import Any, Dict, List
from dataclasses import dataclass
from typing import List


@dataclass(slots=True)
class TestCases(object):
class TestCases:
""" Class that holds test cases for a signature """
match_cases: list
fail_cases: list


@dataclass(frozen=True, slots=True)
# pylint: disable=too-many-instance-attributes
class Signature:
""" Class that handles loaded signature objects. Signatures
define what to search for in Slack and where to search for it.
@@ -36,15 +37,13 @@ def __post_init__(self):
raise TypeError(f'Expected `status` to be of type str, received {type(self.status).__name__}')
if self.author and not isinstance(self.author, str):
raise TypeError(f'Expected `author` to be of type str, received {type(self.author).__name__}')
if self.date and not (isinstance(self.date, datetime.date)
or isinstance(self.date, str)
or isinstance(self.date, datetime.datetime)):
if self.date and not isinstance(self.date, (datetime.date, datetime.datetime, str)):
raise TypeError(f'Expected `date` to be of type str, received {type(self.date).__name__}')
if self.version and not isinstance(self.version, str):
raise TypeError(f'Expected `version` to be of type str, received {type(self.version).__name__}')
if self.description and not isinstance(self.description, str):
raise TypeError(f'Expected `description` to be of type str, received {type(self.description).__name__}')
if self.severity and not (isinstance(self.severity, int) or isinstance(self.severity, str)):
if self.severity and not isinstance(self.severity, (int, str)):
raise TypeError(f'Expected `severity` to be of type int or str, received {type(self.severity).__name__}')
if self.scope and not isinstance(self.scope, list):
raise TypeError(f'Expected `scope` to be of type list, received {type(self.scope).__name__}')
@@ -79,4 +78,4 @@ def create_from_dict(signature_dict: Dict[str, Any]) -> Signature:
fail_cases=signature_dict.get('test_cases', {}).get('fail_cases')
),
search_strings=signature_dict.get('watchman_apps', {}).get('gitlab', {}).get('search_strings'),
patterns=signature_dict.get('patterns'))
patterns=signature_dict.get('patterns'))
Loading
Loading