Skip to content

Commit 8e2aa16

Browse files
Vladimir KontićJoão Silva
authored andcommitted
!55 SDK refactor POC - Findings Closes #103
1 parent c8a9c08 commit 8e2aa16

19 files changed

Lines changed: 999 additions & 179 deletions

probely/__init__.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@
1010
FindingSeverityEnum,
1111
FindingStateEnum,
1212
ScanStatusEnum,
13+
TargetAPISchemaTypeEnum,
1314
TargetRiskEnum,
1415
TargetTypeEnum,
15-
TargetAPISchemaTypeEnum,
1616
)
17-
from .sdk.findings import list_findings, retrieve_finding, retrieve_findings
1817
from .sdk.scans import (
1918
cancel_scan,
2019
cancel_scans,
@@ -61,9 +60,6 @@
6160
"resume_scans",
6261
"pause_scan",
6362
"pause_scans",
64-
"list_findings",
65-
"retrieve_finding",
66-
"retrieve_findings",
6763
"ProbelyException",
6864
"ProbelyObjectNotFound",
6965
"ProbelyMissConfig",

probely/cli/commands/findings/get.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from probely.cli.renderers import OutputRenderer
77
from probely.cli.tables.finding_table import FindingTable
88
from probely.exceptions import ProbelyCLIValidation
9-
from probely.sdk.findings import list_findings, retrieve_findings
9+
from probely.sdk.managers import FindingManager
1010

1111

1212
def findings_get_command_handler(args: argparse.Namespace):
@@ -15,9 +15,9 @@ def findings_get_command_handler(args: argparse.Namespace):
1515
raise ProbelyCLIValidation("filters and Finding IDs are mutually exclusive.")
1616

1717
if args.findings_ids:
18-
findings_generator = retrieve_findings(findings_ids=args.findings_ids)
18+
findings_generator = FindingManager().get_multiple(ids=args.findings_ids)
1919
else:
20-
findings_generator = list_findings(findings_filters=filters)
20+
findings_generator = FindingManager().list(filters=filters)
2121

2222
output_type = OutputEnum[args.output] if args.output else None
2323
renderer = OutputRenderer(

probely/cli/commands/targets/get.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from probely.cli.commands.targets.schemas import TargetApiFiltersSchema
22
from probely.cli.common import prepare_filters_for_api
33
from probely.cli.enums import OutputEnum
4-
54
from probely.cli.renderers import OutputRenderer
65
from probely.cli.tables.targets_table import TargetTable
76
from probely.exceptions import ProbelyCLIValidation

probely/cli/renderers.py

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import json
22
import sys
33
import textwrap
4+
from datetime import datetime
45
from typing import (
56
Dict,
67
Generator,
@@ -17,6 +18,7 @@
1718
from probely.cli.enums import OutputEnum
1819
from probely.cli.tables.base_table import BaseOutputTable
1920
from probely.sdk.enums import ProbelyCLIEnum
21+
from probely.sdk._schemas import Finding, FindingLabel
2022

2123
UNKNOWN_VALUE_REP = "UNKNOWN"
2224
TARGET_NEVER_SCANNED_OUTPUT = "Never_scanned"
@@ -29,7 +31,7 @@ class OutputRenderer:
2931

3032
def __init__(
3133
self,
32-
records: Generator[dict, None, None],
34+
records: Generator[Union[dict, Finding], None, None],
3335
output_type: Optional[OutputEnum],
3436
console: Console,
3537
table_cls: Type[BaseOutputTable],
@@ -53,12 +55,19 @@ def _render_json(self) -> None:
5355
for record in self.records:
5456
if not first:
5557
self.console.print(",")
56-
self.console.print(json.dumps(record, indent=2))
58+
59+
if hasattr(record, "to_json"):
60+
# NOTE: just temporary solution while we finish SDK refactor and start using OOP approach everywhere
61+
self.console.print(record.to_json(indent=2))
62+
else:
63+
self.console.print(json.dumps(record, indent=2))
5764
first = False
5865
self.console.print("]")
5966

6067
def _render_yaml(self) -> None:
6168
for record in self.records:
69+
if hasattr(record, "to_dict"):
70+
record = record.to_dict(mode="json")
6271
self.console.print(yaml.dump([record], indent=2, width=sys.maxsize))
6372

6473
def _render_table(self) -> None:
@@ -79,16 +88,18 @@ def get_printable_enum_value(enum: Type[ProbelyCLIEnum], api_enum_value: str) ->
7988
return UNKNOWN_VALUE_REP # TODO: scenario that risk enum updated but CLI is forgotten
8089

8190

82-
def get_printable_labels(labels: List[Dict] = None) -> str:
91+
def get_printable_labels(labels: List[Union[Dict, FindingLabel]] = None) -> str:
8392
if labels is None:
8493
return "UNKNOWN_LABELS"
8594

8695
labels_names = []
8796
try:
8897
for label in labels:
89-
truncated_label = textwrap.shorten(
90-
label["name"], width=16, placeholder="..."
91-
)
98+
if isinstance(label, FindingLabel):
99+
label_name = label.name
100+
else:
101+
label_name = label["name"]
102+
truncated_label = textwrap.shorten(label_name, width=16, placeholder="...")
92103
labels_names.append(truncated_label)
93104
except:
94105
return "UNKNOWN_LABELS"
@@ -99,12 +110,18 @@ def get_printable_labels(labels: List[Dict] = None) -> str:
99110

100111

101112
def get_printable_date(
102-
date_string: Union[str, None],
113+
date_input: Union[str, datetime, None],
103114
default_string: Union[str, None] = None,
104115
) -> str:
105-
if date_string:
106-
datetime = parser.isoparse(date_string)
107-
return datetime.strftime("%Y-%m-%d %H:%M")
116+
if isinstance(date_input, str):
117+
date_obj = parser.isoparse(date_input)
118+
elif isinstance(date_input, datetime):
119+
date_obj = date_input
120+
else:
121+
date_obj = None
122+
123+
if date_obj:
124+
return date_obj.strftime("%Y-%m-%d %H:%M")
108125

109126
if default_string:
110127
return default_string

probely/cli/tables/finding_table.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Dict
2-
31
from rich.table import Table
42

53
from probely.cli.renderers import (
@@ -9,6 +7,7 @@
97
)
108
from probely.cli.tables.base_table import BaseOutputTable
119
from probely.sdk.enums import FindingSeverityEnum
10+
from probely.sdk._schemas import Finding
1211

1312
DEFAULT_LAST_FOUND_DATE_VALUE = "NO_DATE"
1413

@@ -29,19 +28,16 @@ def create_table(cls, show_header: bool = False) -> Table:
2928
return table
3029

3130
@classmethod
32-
def add_row(cls, table: Table, finding: Dict) -> None:
33-
target = finding.get("target", {})
34-
31+
def add_row(cls, table: Table, finding: Finding) -> None:
32+
target = finding.target
3533
table.add_row(
36-
f"{target['id']}-{finding['id']}", # Composite Finding ID
37-
target["id"], # target_id
38-
get_printable_enum_value(
39-
FindingSeverityEnum, finding["severity"]
40-
), # severity
41-
finding["definition"]["name"], # title
34+
f"{target.id}-{finding.id}", # Composite Finding ID
35+
target.id,
36+
get_printable_enum_value(FindingSeverityEnum, finding.severity), # severity
37+
finding.definition.name, # title
4238
get_printable_date(
43-
finding["last_found"], DEFAULT_LAST_FOUND_DATE_VALUE
39+
finding.last_found, DEFAULT_LAST_FOUND_DATE_VALUE
4440
), # last_found
45-
finding["state"], # state
46-
get_printable_labels(finding["labels"]), # labels
41+
finding.state,
42+
get_printable_labels(finding.labels),
4743
)

0 commit comments

Comments
 (0)