checkmate5 4.1.0.dev18__tar.gz → 4.1.0.dev21__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {checkmate5-4.1.0.dev18/checkmate5.egg-info → checkmate5-4.1.0.dev21}/PKG-INFO +1 -1
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/backend.py +0 -48
- checkmate5-4.1.0.dev21/checkmate/lib/models.py +234 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21/checkmate5.egg-info}/PKG-INFO +1 -1
- checkmate5-4.1.0.dev21/exceptions.py +53 -0
- checkmate5-4.1.0.dev18/checkmate/lib/models.py +0 -518
- checkmate5-4.1.0.dev18/exceptions.py +0 -17
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/.github/workflows/auto-tag.yml +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/.github/workflows/publish-to-pypi.yml +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/CHANGELOG.txt +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/LICENSE.txt +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/MANIFEST.in +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/Pipfile +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/README.md +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/__main__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/all/gptanalyzer/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/all/gptanalyzer/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/all/gptanalyzer/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/all/gptanalyzer/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/cve/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/cve/text4shell/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/cve/text4shell/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/cve/text4shell/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/cve/text4shell/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/commands/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/commands/analyze.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/commands/base.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/commands/diff.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/commands/init.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/commands/update_stats.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/hooks/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/hooks/project.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/lib/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/lib/repository.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/lib/repository_pygit2.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/lib/ssh +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/models.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/git/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/golang/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/golang/gostaticcheck/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/golang/gostaticcheck/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/golang/gostaticcheck/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/golang/gostaticcheck/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/kubescape/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/kubescape/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/kubescape/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/kubescape/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/tfsec/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/tfsec/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/tfsec/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/iac/tfsec/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/java/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/java/semgrepjava/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/java/semgrepjava/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/java/semgrepjava/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/java/semgrepjava/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/javascript/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/javascript/semgrepeslint/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/javascript/semgrepeslint/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/javascript/semgrepeslint/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/javascript/semgrepeslint/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/perl/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/perl/graudit/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/perl/graudit/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/perl/graudit/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/perl/graudit/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/python/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/python/bandit/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/python/bandit/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/python/bandit/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/python/bandit/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/ruby/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/ruby/brakeman/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/ruby/brakeman/analyzer.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/ruby/brakeman/issues_data.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/contrib/plugins/ruby/brakeman/setup.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/exceptions.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/helpers/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/helpers/facts.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/helpers/hashing.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/helpers/issue.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/helpers/settings.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/analysis/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/analysis/base.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/code/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/code/environment.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/stats/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/stats/helpers.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/lib/stats/mapreduce.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/alembic.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/analyze.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/analyzers.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/base.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/compare.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/export.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/info.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/init.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/issues.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/props/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/props/delete.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/props/get.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/props/set.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/reset.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/shell.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/snapshots.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/stats.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/summary.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/sync.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/trend.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/commands/watch.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/decorators.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/management/helpers.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/scripts/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/scripts/manage.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/settings/__init__.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/settings/base.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate/settings/defaults.py +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate5.egg-info/SOURCES.txt +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate5.egg-info/dependency_links.txt +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate5.egg-info/entry_points.txt +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate5.egg-info/requires.txt +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/checkmate5.egg-info/top_level.txt +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/pyproject.toml +0 -0
- {checkmate5-4.1.0.dev18 → checkmate5-4.1.0.dev21}/setup.cfg +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from blitzdb import FileBackend as BlitzDBFileBackend
|
|
2
1
|
from blitzdb.backends.sql import Backend as BlitzDBSQLBackend
|
|
3
2
|
from typing import Any, Optional, Dict
|
|
4
3
|
import logging
|
|
@@ -6,53 +5,6 @@ from contextlib import contextmanager
|
|
|
6
5
|
|
|
7
6
|
logger = logging.getLogger(__name__)
|
|
8
7
|
|
|
9
|
-
class FileBackend(BlitzDBFileBackend):
|
|
10
|
-
def __init__(self, path: str) -> None:
|
|
11
|
-
"""Initialize FileBackend with specified path.
|
|
12
|
-
|
|
13
|
-
Args:
|
|
14
|
-
path: Path to store the database files
|
|
15
|
-
|
|
16
|
-
Raises:
|
|
17
|
-
ValueError: If path is invalid
|
|
18
|
-
"""
|
|
19
|
-
logger.debug(f"Initializing FileBackend with path: {path}")
|
|
20
|
-
super().__init__(path)
|
|
21
|
-
self.path = path
|
|
22
|
-
|
|
23
|
-
def test_connection(self) -> bool:
|
|
24
|
-
"""Test the file access.
|
|
25
|
-
|
|
26
|
-
Returns:
|
|
27
|
-
bool: True if file access is successful
|
|
28
|
-
|
|
29
|
-
Raises:
|
|
30
|
-
ConnectionError: If file access test fails
|
|
31
|
-
"""
|
|
32
|
-
try:
|
|
33
|
-
self.begin()
|
|
34
|
-
self.commit()
|
|
35
|
-
logger.info("File access test successful")
|
|
36
|
-
return True
|
|
37
|
-
except Exception as e:
|
|
38
|
-
logger.error(f"File access test failed: {str(e)}")
|
|
39
|
-
raise ConnectionError(f"File access test failed: {str(e)}")
|
|
40
|
-
|
|
41
|
-
@contextmanager
|
|
42
|
-
def session(self):
|
|
43
|
-
"""Context manager for file operations.
|
|
44
|
-
|
|
45
|
-
Yields:
|
|
46
|
-
FileBackend: Self with active session
|
|
47
|
-
"""
|
|
48
|
-
try:
|
|
49
|
-
self.begin()
|
|
50
|
-
yield self
|
|
51
|
-
self.commit()
|
|
52
|
-
except Exception as e:
|
|
53
|
-
logger.error(f"Session error: {str(e)}")
|
|
54
|
-
self.rollback()
|
|
55
|
-
raise
|
|
56
8
|
|
|
57
9
|
class SQLBackend(BlitzDBSQLBackend):
|
|
58
10
|
def __init__(self, connection: Any) -> None:
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from blitzdb import Document
|
|
4
|
+
from blitzdb.fields import (BooleanField,
|
|
5
|
+
CharField,
|
|
6
|
+
DateTimeField,
|
|
7
|
+
ForeignKeyField,
|
|
8
|
+
ManyToManyField,
|
|
9
|
+
TextField,
|
|
10
|
+
EnumField,
|
|
11
|
+
IntegerField)
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import uuid
|
|
15
|
+
import time
|
|
16
|
+
import datetime
|
|
17
|
+
import logging
|
|
18
|
+
import traceback
|
|
19
|
+
|
|
20
|
+
from checkmate.helpers.hashing import Hasher
|
|
21
|
+
from checkmate.lib.stats.helpers import directory_splitter
|
|
22
|
+
from checkmate.lib.analysis import AnalyzerSettingsError
|
|
23
|
+
from checkmate.helpers.issue import IssuesMapReducer
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
from sqlalchemy.sql import (select,
|
|
27
|
+
insert,
|
|
28
|
+
func,
|
|
29
|
+
and_,
|
|
30
|
+
expression,
|
|
31
|
+
exists)
|
|
32
|
+
except ImportError:
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
logger = logging.getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
class BaseDocument(Document):
|
|
38
|
+
|
|
39
|
+
__abstract__ = True
|
|
40
|
+
|
|
41
|
+
created_at = DateTimeField(auto_now_add=True, indexed=True)
|
|
42
|
+
updated_at = DateTimeField(auto_now=True, indexed=True)
|
|
43
|
+
|
|
44
|
+
def before_save(self):
|
|
45
|
+
if not 'created_at' in self:
|
|
46
|
+
self.created_at = datetime.datetime.now()
|
|
47
|
+
self.updated_at = datetime.datetime.now()
|
|
48
|
+
|
|
49
|
+
def before_update(self, set_fields, unset_fields):
|
|
50
|
+
self.updated_at = datetime.datetime.now()
|
|
51
|
+
set_fields['updated_at'] = self.updated_at
|
|
52
|
+
|
|
53
|
+
class IssueCategory(BaseDocument):
|
|
54
|
+
|
|
55
|
+
name = CharField(indexed=True, unique=True, length=50)
|
|
56
|
+
|
|
57
|
+
class IssueClass(BaseDocument):
|
|
58
|
+
|
|
59
|
+
class Severity:
|
|
60
|
+
critical = 1
|
|
61
|
+
potential_bug = 2
|
|
62
|
+
minor = 3
|
|
63
|
+
recommendation = 4
|
|
64
|
+
|
|
65
|
+
hash = CharField(indexed=True, length=64)
|
|
66
|
+
title = CharField(indexed=True, length=100)
|
|
67
|
+
analyzer = CharField(indexed=True, length=50)
|
|
68
|
+
language = CharField(indexed=True, length=50)
|
|
69
|
+
code = CharField(indexed=True, length=50)
|
|
70
|
+
description = TextField(indexed=False)
|
|
71
|
+
|
|
72
|
+
occurrence_description = CharField(indexed=True, length=2000)
|
|
73
|
+
|
|
74
|
+
severity = IntegerField(indexed=True)
|
|
75
|
+
categories = ManyToManyField('IssueCategory')
|
|
76
|
+
|
|
77
|
+
class Meta(BaseDocument.Meta):
|
|
78
|
+
unique_together = (('code', 'analyzer'),)
|
|
79
|
+
|
|
80
|
+
class IssueOccurrence(BaseDocument):
|
|
81
|
+
|
|
82
|
+
hash = CharField(indexed=True, length=64)
|
|
83
|
+
file_revision = ForeignKeyField(
|
|
84
|
+
'FileRevision', backref='issue_occurrences')
|
|
85
|
+
issue = ForeignKeyField('Issue', backref='issue_occurrences')
|
|
86
|
+
from_row = IntegerField()
|
|
87
|
+
to_row = IntegerField()
|
|
88
|
+
from_column = IntegerField()
|
|
89
|
+
to_column = IntegerField()
|
|
90
|
+
sequence = IntegerField(default=0)
|
|
91
|
+
|
|
92
|
+
class Issue(BaseDocument):
|
|
93
|
+
|
|
94
|
+
class IgnoreReason:
|
|
95
|
+
not_specified = 0
|
|
96
|
+
not_relevant = 1
|
|
97
|
+
false_positive = 2
|
|
98
|
+
|
|
99
|
+
hash = CharField(indexed=True, length=64)
|
|
100
|
+
configuration = CharField(indexed=True, length=64)
|
|
101
|
+
project = ForeignKeyField('Project', backref='issues', nullable=False)
|
|
102
|
+
analyzer = CharField(indexed=True, length=100, nullable=False)
|
|
103
|
+
code = CharField(indexed=True, length=100, nullable=False)
|
|
104
|
+
fingerprint = CharField(indexed=True, length=255, nullable=False)
|
|
105
|
+
|
|
106
|
+
ignore = BooleanField(indexed=True, default=False, nullable=False)
|
|
107
|
+
ignore_reason = IntegerField(indexed=True, nullable=True)
|
|
108
|
+
ignore_comment = CharField(indexed=False, length=255, nullable=True)
|
|
109
|
+
|
|
110
|
+
class Meta(Document.Meta):
|
|
111
|
+
unique_together = [('project', 'fingerprint', 'analyzer', 'code')]
|
|
112
|
+
dbref_includes = ['code', 'analyzer']
|
|
113
|
+
|
|
114
|
+
class MockFileRevision(BaseDocument):
|
|
115
|
+
|
|
116
|
+
__abstract__ = True
|
|
117
|
+
|
|
118
|
+
def get_file_content(self):
|
|
119
|
+
return self.code
|
|
120
|
+
|
|
121
|
+
class FileRevision(BaseDocument):
|
|
122
|
+
|
|
123
|
+
hash = CharField(indexed=True, length=64)
|
|
124
|
+
configuration = CharField(indexed=True, length=64)
|
|
125
|
+
project = ForeignKeyField('Project')
|
|
126
|
+
path = CharField(indexed=True, length=2000)
|
|
127
|
+
language = CharField(indexed=True, length=50)
|
|
128
|
+
sha = CharField(indexed=True, length=64)
|
|
129
|
+
dependencies = ManyToManyField(
|
|
130
|
+
'FileRevision', backref='dependent_file_revisions')
|
|
131
|
+
|
|
132
|
+
class Meta(Document.Meta):
|
|
133
|
+
collection = "filerevision"
|
|
134
|
+
|
|
135
|
+
def get_file_content(self):
|
|
136
|
+
if hasattr(self, '_file_content'):
|
|
137
|
+
if callable(self._file_content):
|
|
138
|
+
return self._file_content()
|
|
139
|
+
return self._file_content
|
|
140
|
+
raise NotImplementedError
|
|
141
|
+
|
|
142
|
+
class Diff(BaseDocument):
|
|
143
|
+
|
|
144
|
+
hash = CharField(indexed=True, length=64)
|
|
145
|
+
configuration = CharField(indexed=True, length=64)
|
|
146
|
+
project = ForeignKeyField('Project', backref='diffs')
|
|
147
|
+
snapshot_a = ForeignKeyField('Snapshot', backref='diffs_a')
|
|
148
|
+
snapshot_b = ForeignKeyField('Snapshot', backref='diffs_b')
|
|
149
|
+
|
|
150
|
+
def summarize_issues(self, include_filename=False, ignore=False):
|
|
151
|
+
# Placeholder for non-FileBackend summarization
|
|
152
|
+
return {
|
|
153
|
+
"added": [],
|
|
154
|
+
"fixed": []
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
class DiffIssueOccurrence(BaseDocument):
|
|
158
|
+
|
|
159
|
+
hash = CharField(indexed=True, length=64)
|
|
160
|
+
configuration = CharField(indexed=True, length=64)
|
|
161
|
+
diff = ForeignKeyField('Diff', backref='issue_occurrences')
|
|
162
|
+
issue_occurrence = ForeignKeyField(
|
|
163
|
+
'IssueOccurrence', backref='diff_issue_occurrences')
|
|
164
|
+
key = EnumField(enums=('added', 'fixed'))
|
|
165
|
+
|
|
166
|
+
class DiffFileRevision(BaseDocument):
|
|
167
|
+
|
|
168
|
+
hash = CharField(indexed=True, length=64)
|
|
169
|
+
configuration = CharField(indexed=True, length=64)
|
|
170
|
+
diff = ForeignKeyField('Diff', backref='file_revisions')
|
|
171
|
+
file_revision = ForeignKeyField('FileRevision', backref='diffs')
|
|
172
|
+
key = EnumField(enums=('added', 'deleted', 'modified'))
|
|
173
|
+
|
|
174
|
+
class Snapshot(BaseDocument):
|
|
175
|
+
|
|
176
|
+
hash = CharField(indexed=True, length=64)
|
|
177
|
+
configuration = CharField(indexed=True, length=64)
|
|
178
|
+
project = ForeignKeyField('Project')
|
|
179
|
+
file_revisions = ManyToManyField('FileRevision', backref='snapshots')
|
|
180
|
+
analyzed = BooleanField(indexed=True)
|
|
181
|
+
|
|
182
|
+
class Meta(Document.Meta):
|
|
183
|
+
pass
|
|
184
|
+
|
|
185
|
+
def summarize_issues(self, include_filename=False, ignore=False):
|
|
186
|
+
# Placeholder for non-FileBackend summarization
|
|
187
|
+
return {
|
|
188
|
+
"issues": []
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
class ProjectIssueClass(BaseDocument):
|
|
192
|
+
|
|
193
|
+
project = ForeignKeyField('Project', backref='project_issue_classes')
|
|
194
|
+
issue_class = ForeignKeyField(
|
|
195
|
+
'IssueClass', backref='project_issue_classes')
|
|
196
|
+
enabled = BooleanField(default=True)
|
|
197
|
+
|
|
198
|
+
class Meta(BaseDocument.Meta):
|
|
199
|
+
unique_together = (('project', 'issue_class'),)
|
|
200
|
+
|
|
201
|
+
class Project(BaseDocument):
|
|
202
|
+
|
|
203
|
+
IssueClass = IssueClass
|
|
204
|
+
project_id = IntegerField(indexed=True, unique=True)
|
|
205
|
+
|
|
206
|
+
configuration = CharField(indexed=True, length=64)
|
|
207
|
+
|
|
208
|
+
class Meta(Document.Meta):
|
|
209
|
+
collection = "project"
|
|
210
|
+
|
|
211
|
+
@property
|
|
212
|
+
def settings(self):
|
|
213
|
+
return self.get('settings', {})
|
|
214
|
+
|
|
215
|
+
def get_issue_classes(self, backend=None, enabled=True, sort=None, **kwargs):
|
|
216
|
+
# Simplified logic without FileBackend
|
|
217
|
+
query = {'project_issue_classes.project': self}
|
|
218
|
+
if enabled is not None:
|
|
219
|
+
query['project_issue_classes.enabled'] = enabled
|
|
220
|
+
|
|
221
|
+
issue_classes = [] # Replace with backend-independent logic
|
|
222
|
+
|
|
223
|
+
return issue_classes
|
|
224
|
+
|
|
225
|
+
def get_issues_data(self, backend=None, extra_fields=None):
|
|
226
|
+
|
|
227
|
+
if extra_fields is None:
|
|
228
|
+
extra_fields = []
|
|
229
|
+
|
|
230
|
+
grouped_issue_data = {}
|
|
231
|
+
|
|
232
|
+
# Simplified placeholder logic for issues data retrieval
|
|
233
|
+
return grouped_issue_data
|
|
234
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
class ConfigurationError(Exception):
|
|
2
|
+
"""Exception raised for configuration-related errors.
|
|
3
|
+
|
|
4
|
+
Attributes:
|
|
5
|
+
message -- explanation of the error
|
|
6
|
+
config -- configuration that caused the error (optional)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, message: str, config: dict = None) -> None:
|
|
10
|
+
self.message = message
|
|
11
|
+
self.config = config
|
|
12
|
+
super().__init__(self.message)
|
|
13
|
+
|
|
14
|
+
def __str__(self) -> str:
|
|
15
|
+
if self.config:
|
|
16
|
+
return f"{self.message} (Config: {self.config})"
|
|
17
|
+
return self.message
|
|
18
|
+
|
|
19
|
+
class SQLBackend:
|
|
20
|
+
def __init__(self, *args, **kwargs):
|
|
21
|
+
# ... existing code ...
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
def create_tables(self):
|
|
25
|
+
"""
|
|
26
|
+
Creates necessary database tables if they don't exist.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
# Create tables for storing analysis results
|
|
31
|
+
with self.engine.connect() as connection:
|
|
32
|
+
connection.execute("""
|
|
33
|
+
CREATE TABLE IF NOT EXISTS analysis_results (
|
|
34
|
+
id SERIAL PRIMARY KEY,
|
|
35
|
+
hash TEXT,
|
|
36
|
+
analyzer TEXT,
|
|
37
|
+
line INTEGER,
|
|
38
|
+
file TEXT,
|
|
39
|
+
severity TEXT,
|
|
40
|
+
code TEXT,
|
|
41
|
+
description TEXT,
|
|
42
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
43
|
+
)
|
|
44
|
+
""")
|
|
45
|
+
except Exception as e:
|
|
46
|
+
raise DatabaseError(f"Failed to create tables: {str(e)}")
|
|
47
|
+
|
|
48
|
+
class DatabaseError(Exception):
|
|
49
|
+
"""Exception raised for database-related errors."""
|
|
50
|
+
|
|
51
|
+
def __init__(self, message: str) -> None:
|
|
52
|
+
self.message = message
|
|
53
|
+
super().__init__(self.message)
|