Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| eeae701c4f | |||
| 6527165498 | |||
| 2e5cbcc666 | |||
| 11e4569360 | |||
| 2613ac1388 | |||
| 0c4a3ec376 | |||
| 7734a7f728 | |||
| ae9fc1e54d | |||
| 5ac234aa7f | |||
| 42d2514680 | |||
| d11ea8e99e | |||
| 96daf3df57 | |||
| 255fd2cfe8 | |||
| eb0abc0c15 | |||
| ad56432a3b | |||
| a88ce088f3 | |||
| 79d9f7c5dd | |||
| a2a9d4772a | |||
| 07e2d9c9a2 | |||
| 5828a2da6c | |||
| d19d867d78 | |||
| 754b334acd | |||
| a846225f93 | |||
| 8bd320237a | |||
| 883d0161fc | |||
| 6fc403de85 | |||
| 072a4c1e00 | |||
| 7922dccb80 | |||
| 6f2a5b4e54 | |||
| b23ebf838a | |||
| d1322f259a | |||
| c3cb7cc142 | |||
| 89df03a9b9 | |||
| 9c6de1b32e | |||
| 6611aa6fd8 | |||
| 16b8daa3d4 | |||
| ea08d50b30 | |||
| 9e29cb5813 |
@@ -1,6 +1,6 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import dataclass
|
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
from depaudit.checks import LicenseInfo
|
from depaudit.checks import LicenseInfo
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import json
|
|
||||||
import re
|
import re
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import ast
|
|||||||
import re
|
import re
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
from depaudit.checks import UnusedDependency
|
from depaudit.checks import UnusedDependency
|
||||||
|
|
||||||
@@ -51,7 +50,6 @@ class PythonSourceParser(SourceParser):
|
|||||||
)
|
)
|
||||||
elif isinstance(node, ast.ImportFrom):
|
elif isinstance(node, ast.ImportFrom):
|
||||||
module = node.module or ""
|
module = node.module or ""
|
||||||
names = [alias.asname or alias.name for alias in node.names]
|
|
||||||
for alias in node.names:
|
for alias in node.names:
|
||||||
imports.append(
|
imports.append(
|
||||||
ImportStatement(
|
ImportStatement(
|
||||||
|
|||||||
@@ -1,18 +1,13 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import json
|
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
import click
|
import click
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from depaudit import __version__
|
from depaudit import __version__
|
||||||
from depaudit.checks.outdated import OutdatedPackage
|
|
||||||
from depaudit.checks.licenses import LicenseInfo
|
|
||||||
from depaudit.checks.unused import UnusedDependency
|
|
||||||
from depaudit.checks.vulnerabilities import Vulnerability
|
from depaudit.checks.vulnerabilities import Vulnerability
|
||||||
from depaudit.checks.outdated import check_outdated
|
from depaudit.checks.outdated import check_outdated
|
||||||
from depaudit.checks.licenses import check_license, validate_license_compliance
|
from depaudit.checks.licenses import check_license, validate_license_compliance
|
||||||
@@ -20,7 +15,6 @@ from depaudit.checks.unused import check_unused_dependencies
|
|||||||
from depaudit.config import config
|
from depaudit.config import config
|
||||||
from depaudit.output import AuditResult
|
from depaudit.output import AuditResult
|
||||||
from depaudit.output.factory import FormatterFactory
|
from depaudit.output.factory import FormatterFactory
|
||||||
from depaudit.parsers import ParsedManifest
|
|
||||||
from depaudit.parsers.factory import ParserFactory
|
from depaudit.parsers.factory import ParserFactory
|
||||||
|
|
||||||
|
|
||||||
@@ -217,7 +211,7 @@ def audit(
|
|||||||
|
|
||||||
def check_vulnerability(dep, severity_filter: str) -> Vulnerability | None:
|
def check_vulnerability(dep, severity_filter: str) -> Vulnerability | None:
|
||||||
try:
|
try:
|
||||||
url = f"https://api.osv.dev/v1/query"
|
url = "https://api.osv.dev/v1/query"
|
||||||
payload = {
|
payload = {
|
||||||
"package": {"name": dep.name},
|
"package": {"name": dep.name},
|
||||||
"version": dep.version,
|
"version": dep.version,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import subprocess
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from depaudit.checks import Vulnerability, OutdatedPackage
|
from depaudit.checks import OutdatedPackage
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
from depaudit.output import Formatter
|
from depaudit.output import Formatter
|
||||||
from depaudit.output.json_formatter import JSONFormatter
|
from depaudit.output.json_formatter import JSONFormatter
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ class TableFormatter(Formatter):
|
|||||||
lines.append("SEVERITY SUMMARY:")
|
lines.append("SEVERITY SUMMARY:")
|
||||||
for severity, count in summary["severity_breakdown"].items():
|
for severity, count in summary["severity_breakdown"].items():
|
||||||
if count > 0:
|
if count > 0:
|
||||||
color = SEVERITY_COLORS.get(severity, "grey")
|
|
||||||
lines.append(f" {severity.upper()}: {count}")
|
lines.append(f" {severity.upper()}: {count}")
|
||||||
|
|
||||||
lines.append("")
|
lines.append("")
|
||||||
@@ -67,8 +66,6 @@ class TableFormatter(Formatter):
|
|||||||
return "\n".join(lines)
|
return "\n".join(lines)
|
||||||
|
|
||||||
def _render_table(self, table: Table) -> str:
|
def _render_table(self, table: Table) -> str:
|
||||||
from io import StringIO
|
|
||||||
output = StringIO()
|
|
||||||
self.console.begin_capture()
|
self.console.begin_capture()
|
||||||
self.console.print(table)
|
self.console.print(table)
|
||||||
captured = self.console.end_capture()
|
captured = self.console.end_capture()
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
from depaudit.parsers import Parser, ParsedManifest, Dependency
|
from depaudit.parsers import Parser, ParsedManifest
|
||||||
|
|
||||||
|
|
||||||
class GoParser(Parser):
|
class GoParser(Parser):
|
||||||
@@ -27,7 +26,6 @@ class GoParser(Parser):
|
|||||||
|
|
||||||
while i < len(lines):
|
while i < len(lines):
|
||||||
line = lines[i].strip()
|
line = lines[i].strip()
|
||||||
original_line = lines[i]
|
|
||||||
|
|
||||||
if not line or line.startswith("//"):
|
if not line or line.startswith("//"):
|
||||||
i += 1
|
i += 1
|
||||||
|
|||||||
@@ -2,9 +2,8 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
from depaudit.parsers import Parser, ParsedManifest, Dependency
|
from depaudit.parsers import Parser, ParsedManifest
|
||||||
|
|
||||||
|
|
||||||
class JavaParser(Parser):
|
class JavaParser(Parser):
|
||||||
@@ -138,8 +137,8 @@ class JavaParser(Parser):
|
|||||||
def _extract_gradle_value(self, content: str, key: str) -> str | None:
|
def _extract_gradle_value(self, content: str, key: str) -> str | None:
|
||||||
import re
|
import re
|
||||||
patterns = [
|
patterns = [
|
||||||
key + "\s*=\s*["']([^"\']+)["']",
|
key + r"\s*=\s*[\"']([^\"']+)[\"']",
|
||||||
key + "\s*=\s*([^\s]+)",
|
key + r"\s*=\s*([^\s]+)",
|
||||||
]
|
]
|
||||||
for pattern in patterns:
|
for pattern in patterns:
|
||||||
match = re.search(pattern, content)
|
match = re.search(pattern, content)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import json
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from depaudit.parsers import Parser, ParsedManifest, Dependency
|
from depaudit.parsers import Parser, ParsedManifest
|
||||||
|
|
||||||
|
|
||||||
class JavaScriptParser(Parser):
|
class JavaScriptParser(Parser):
|
||||||
|
|||||||
@@ -3,14 +3,13 @@ from __future__ import annotations
|
|||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 11):
|
if sys.version_info >= (3, 11):
|
||||||
import tomllib
|
import tomllib
|
||||||
else:
|
else:
|
||||||
import tomli as tomllib
|
import tomli as tomllib
|
||||||
|
|
||||||
from depaudit.parsers import Parser, ParsedManifest, Dependency
|
from depaudit.parsers import Parser, ParsedManifest
|
||||||
|
|
||||||
|
|
||||||
class PythonParser(Parser):
|
class PythonParser(Parser):
|
||||||
@@ -119,11 +118,11 @@ class PythonParser(Parser):
|
|||||||
self._create_dependency(file_path, name, version)
|
self._create_dependency(file_path, name, version)
|
||||||
)
|
)
|
||||||
|
|
||||||
name_match = re.search(r'name\s*=\s*["']([^"\']+)["']', content)
|
name_match = re.search(r"name\s*=\s*[\"']([^\"']+)[\"']", content)
|
||||||
if name_match:
|
if name_match:
|
||||||
manifest.project_name = name_match.group(1)
|
manifest.project_name = name_match.group(1)
|
||||||
|
|
||||||
version_match = re.search(r'version\s*=\s*["']([^"\']+)["']', content)
|
version_match = re.search(r"version\s*=\s*[\"']([^\"']+)[\"']", content)
|
||||||
if version_match:
|
if version_match:
|
||||||
manifest.project_version = version_match.group(1)
|
manifest.project_version = version_match.group(1)
|
||||||
|
|
||||||
@@ -147,7 +146,7 @@ class PythonParser(Parser):
|
|||||||
def _parse_pipfile(self, file_path: Path, manifest: ParsedManifest) -> None:
|
def _parse_pipfile(self, file_path: Path, manifest: ParsedManifest) -> None:
|
||||||
content = file_path.read_text(encoding="utf-8")
|
content = file_path.read_text(encoding="utf-8")
|
||||||
|
|
||||||
name_match = re.search(r'name\s*=\s*["']([^"\']+)["']', content)
|
name_match = re.search(r"name\s*=\s*[\"']([^\"']+)[\"']", content)
|
||||||
if name_match:
|
if name_match:
|
||||||
manifest.project_name = name_match.group(1)
|
manifest.project_name = name_match.group(1)
|
||||||
|
|
||||||
@@ -195,10 +194,8 @@ class PythonParser(Parser):
|
|||||||
extras_match = re.match(r"([^\[]+)(?:\[([^\]]+)\])?", req)
|
extras_match = re.match(r"([^\[]+)(?:\[([^\]]+)\])?", req)
|
||||||
if extras_match:
|
if extras_match:
|
||||||
name = extras_match.group(1)
|
name = extras_match.group(1)
|
||||||
extras = extras_match.group(2)
|
|
||||||
else:
|
else:
|
||||||
name = req
|
name = req
|
||||||
extras = None
|
|
||||||
|
|
||||||
for op in ["==", ">=", "<=", "~=", "!=", ">", "<", "==="]:
|
for op in ["==", ">=", "<=", "~=", "!=", ">", "<", "==="]:
|
||||||
if op in name:
|
if op in name:
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import tomllib
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from depaudit.parsers import Parser, ParsedManifest, Dependency
|
from depaudit.parsers import Parser, ParsedManifest
|
||||||
|
|
||||||
|
|
||||||
class RustParser(Parser):
|
class RustParser(Parser):
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
"""Pytest configuration and fixtures for DepAudit tests."""
|
"""Pytest configuration and fixtures for DepAudit tests."""
|
||||||
|
|
||||||
import json
|
|
||||||
import tempfile
|
import tempfile
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import pytest
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import tempfile
|
import tempfile
|
||||||
import json
|
import json
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
import pytest
|
from unittest.mock import patch
|
||||||
from unittest.mock import Mock, patch
|
|
||||||
from depaudit.utils.version import (
|
from depaudit.utils.version import (
|
||||||
parse_version,
|
parse_version,
|
||||||
compare_versions,
|
compare_versions,
|
||||||
is_version_outdated,
|
is_version_outdated,
|
||||||
extract_version_from_specifier,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import pytest
|
import pytest
|
||||||
from unittest.mock import patch, Mock
|
|
||||||
from click.testing import CliRunner
|
from click.testing import CliRunner
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import pytest
|
|
||||||
from unittest.mock import Mock, patch
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from depaudit.output import AuditResult, Formatter
|
from depaudit.output import AuditResult
|
||||||
from depaudit.output.json_formatter import JSONFormatter
|
from depaudit.output.json_formatter import JSONFormatter
|
||||||
from depaudit.output.table_formatter import TableFormatter
|
from depaudit.output.table_formatter import TableFormatter
|
||||||
from depaudit.output.factory import FormatterFactory
|
from depaudit.output.factory import FormatterFactory
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
import json
|
import json
|
||||||
import pytest
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from depaudit.parsers import Parser, ParsedManifest
|
|
||||||
from depaudit.parsers.javascript import JavaScriptParser
|
from depaudit.parsers.javascript import JavaScriptParser
|
||||||
from depaudit.parsers.python import PythonParser
|
from depaudit.parsers.python import PythonParser
|
||||||
from depaudit.parsers.go import GoParser
|
from depaudit.parsers.go import GoParser
|
||||||
|
|||||||
Reference in New Issue
Block a user