capo-codeguru-security 0.1.0__py3-none-any.whl
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.
- capo_codeguru_security/__init__.py +74 -0
- capo_codeguru_security/_async.py +25 -0
- capo_codeguru_security/_auth/_identity.py +16 -0
- capo_codeguru_security/_auth/_providers.py +886 -0
- capo_codeguru_security/_auth/_signers.py +88 -0
- capo_codeguru_security/_auth/_sigv4.py +434 -0
- capo_codeguru_security/_auth/_zapros_handler.py +80 -0
- capo_codeguru_security/_iter.py +113 -0
- capo_codeguru_security/_operations/aws_code_guru_security/batch_get_findings.py +167 -0
- capo_codeguru_security/_operations/aws_code_guru_security/create_scan.py +183 -0
- capo_codeguru_security/_operations/aws_code_guru_security/create_upload_url.py +165 -0
- capo_codeguru_security/_operations/aws_code_guru_security/get_account_configuration.py +161 -0
- capo_codeguru_security/_operations/aws_code_guru_security/get_findings.py +191 -0
- capo_codeguru_security/_operations/aws_code_guru_security/get_metrics_summary.py +176 -0
- capo_codeguru_security/_operations/aws_code_guru_security/get_scan.py +173 -0
- capo_codeguru_security/_operations/aws_code_guru_security/list_findings_metrics.py +185 -0
- capo_codeguru_security/_operations/aws_code_guru_security/list_scans.py +167 -0
- capo_codeguru_security/_operations/aws_code_guru_security/list_tags_for_resource.py +173 -0
- capo_codeguru_security/_operations/aws_code_guru_security/tag_resource.py +173 -0
- capo_codeguru_security/_operations/aws_code_guru_security/untag_resource.py +171 -0
- capo_codeguru_security/_operations/aws_code_guru_security/update_account_configuration.py +172 -0
- capo_codeguru_security/_pagination.py +21 -0
- capo_codeguru_security/_protocol/__init__.py +1 -0
- capo_codeguru_security/_protocol/errors.py +93 -0
- capo_codeguru_security/_protocol/eventstream.py +238 -0
- capo_codeguru_security/_protocol/serialize.py +47 -0
- capo_codeguru_security/_protocol/xml.py +33 -0
- capo_codeguru_security/_rule_engine/__init__.py +0 -0
- capo_codeguru_security/_rule_engine/_aws_partition.py +160 -0
- capo_codeguru_security/_rule_engine/_endpoint_rule_set.py +137 -0
- capo_codeguru_security/_rule_engine/_endpoint_runtime.py +389 -0
- capo_codeguru_security/_services/_aws_config.py +160 -0
- capo_codeguru_security/_services/_pipeline.py +198 -0
- capo_codeguru_security/_services/async_code_guru_security.py +934 -0
- capo_codeguru_security/_services/code_guru_security.py +921 -0
- capo_codeguru_security/errors/__init__.py +33 -0
- capo_codeguru_security/errors/_base.py +94 -0
- capo_codeguru_security/errors/access_denied_exception.py +67 -0
- capo_codeguru_security/errors/conflict_exception.py +67 -0
- capo_codeguru_security/errors/internal_server_exception.py +53 -0
- capo_codeguru_security/errors/resource_not_found_exception.py +69 -0
- capo_codeguru_security/errors/throttling_exception.py +65 -0
- capo_codeguru_security/errors/validation_exception.py +98 -0
- capo_codeguru_security/py.typed +0 -0
- capo_codeguru_security/types/_prelude/blob.py +12 -0
- capo_codeguru_security/types/_prelude/timestamp.py +17 -0
- capo_codeguru_security/types/account_findings_metric.py +118 -0
- capo_codeguru_security/types/analysis_type.py +17 -0
- capo_codeguru_security/types/batch_get_findings_error.py +61 -0
- capo_codeguru_security/types/batch_get_findings_errors.py +35 -0
- capo_codeguru_security/types/batch_get_findings_request.py +47 -0
- capo_codeguru_security/types/batch_get_findings_response.py +61 -0
- capo_codeguru_security/types/categories_with_most_findings.py +37 -0
- capo_codeguru_security/types/category_with_finding_num.py +29 -0
- capo_codeguru_security/types/client_token.py +5 -0
- capo_codeguru_security/types/code_line.py +29 -0
- capo_codeguru_security/types/code_snippet.py +29 -0
- capo_codeguru_security/types/create_scan_request.py +101 -0
- capo_codeguru_security/types/create_scan_response.py +78 -0
- capo_codeguru_security/types/create_upload_url_request.py +31 -0
- capo_codeguru_security/types/create_upload_url_response.py +59 -0
- capo_codeguru_security/types/detector_tags.py +14 -0
- capo_codeguru_security/types/encryption_config.py +28 -0
- capo_codeguru_security/types/error_code.py +20 -0
- capo_codeguru_security/types/error_message.py +5 -0
- capo_codeguru_security/types/file_path.py +62 -0
- capo_codeguru_security/types/finding.py +207 -0
- capo_codeguru_security/types/finding_identifier.py +33 -0
- capo_codeguru_security/types/finding_identifiers.py +33 -0
- capo_codeguru_security/types/finding_metrics_value_per_severity.py +87 -0
- capo_codeguru_security/types/findings.py +29 -0
- capo_codeguru_security/types/findings_metric_list.py +35 -0
- capo_codeguru_security/types/get_account_configuration_request.py +18 -0
- capo_codeguru_security/types/get_account_configuration_response.py +45 -0
- capo_codeguru_security/types/get_findings_request.py +32 -0
- capo_codeguru_security/types/get_findings_response.py +43 -0
- capo_codeguru_security/types/get_metrics_summary_request.py +24 -0
- capo_codeguru_security/types/get_metrics_summary_response.py +42 -0
- capo_codeguru_security/types/get_scan_request.py +27 -0
- capo_codeguru_security/types/get_scan_response.py +132 -0
- capo_codeguru_security/types/header_key.py +5 -0
- capo_codeguru_security/types/header_value.py +5 -0
- capo_codeguru_security/types/kms_key_arn.py +5 -0
- capo_codeguru_security/types/list_findings_metrics_request.py +32 -0
- capo_codeguru_security/types/list_findings_metrics_response.py +49 -0
- capo_codeguru_security/types/list_scans_request.py +26 -0
- capo_codeguru_security/types/list_scans_response.py +43 -0
- capo_codeguru_security/types/list_tags_for_resource_request.py +24 -0
- capo_codeguru_security/types/list_tags_for_resource_response.py +34 -0
- capo_codeguru_security/types/metrics_summary.py +121 -0
- capo_codeguru_security/types/next_token.py +5 -0
- capo_codeguru_security/types/recommendation.py +29 -0
- capo_codeguru_security/types/reference_urls.py +14 -0
- capo_codeguru_security/types/related_vulnerabilities.py +14 -0
- capo_codeguru_security/types/remediation.py +63 -0
- capo_codeguru_security/types/request_header_map.py +29 -0
- capo_codeguru_security/types/resource.py +29 -0
- capo_codeguru_security/types/resource_id.py +32 -0
- capo_codeguru_security/types/s3_url.py +5 -0
- capo_codeguru_security/types/scan_name.py +5 -0
- capo_codeguru_security/types/scan_name_arn.py +5 -0
- capo_codeguru_security/types/scan_name_with_finding_num.py +29 -0
- capo_codeguru_security/types/scan_state.py +18 -0
- capo_codeguru_security/types/scan_summaries.py +29 -0
- capo_codeguru_security/types/scan_summary.py +99 -0
- capo_codeguru_security/types/scan_type.py +17 -0
- capo_codeguru_security/types/scans_with_most_open_critical_findings.py +37 -0
- capo_codeguru_security/types/scans_with_most_open_findings.py +37 -0
- capo_codeguru_security/types/severity.py +20 -0
- capo_codeguru_security/types/status.py +18 -0
- capo_codeguru_security/types/suggested_fix.py +29 -0
- capo_codeguru_security/types/suggested_fixes.py +31 -0
- capo_codeguru_security/types/tag_key.py +5 -0
- capo_codeguru_security/types/tag_key_list.py +17 -0
- capo_codeguru_security/types/tag_map.py +29 -0
- capo_codeguru_security/types/tag_resource_request.py +40 -0
- capo_codeguru_security/types/tag_resource_response.py +18 -0
- capo_codeguru_security/types/tag_value.py +5 -0
- capo_codeguru_security/types/untag_resource_request.py +27 -0
- capo_codeguru_security/types/untag_resource_response.py +18 -0
- capo_codeguru_security/types/update_account_configuration_request.py +45 -0
- capo_codeguru_security/types/update_account_configuration_response.py +45 -0
- capo_codeguru_security/types/uuid.py +5 -0
- capo_codeguru_security/types/validation_exception_field.py +33 -0
- capo_codeguru_security/types/validation_exception_field_list.py +37 -0
- capo_codeguru_security/types/validation_exception_reason.py +20 -0
- capo_codeguru_security/types/vulnerability.py +90 -0
- capo_codeguru_security-0.1.0.dist-info/METADATA +101 -0
- capo_codeguru_security-0.1.0.dist-info/RECORD +132 -0
- capo_codeguru_security-0.1.0.dist-info/WHEEL +5 -0
- capo_codeguru_security-0.1.0.dist-info/licenses/LICENSE +21 -0
- capo_codeguru_security-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import random
|
|
4
|
+
import time
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import TYPE_CHECKING, Awaitable, Callable, Generic, TypeVar
|
|
8
|
+
|
|
9
|
+
from zapros import (
|
|
10
|
+
AsyncClient,
|
|
11
|
+
Client,
|
|
12
|
+
ConnectionError,
|
|
13
|
+
Response,
|
|
14
|
+
SSLError,
|
|
15
|
+
TimeoutError,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
from capo_codeguru_security._async import anysleep
|
|
19
|
+
from capo_codeguru_security.errors import ServiceError
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from capo_codeguru_security._auth._identity import Credentials
|
|
23
|
+
from capo_codeguru_security._auth._providers import IdentityProvider
|
|
24
|
+
|
|
25
|
+
TInput = TypeVar("TInput")
|
|
26
|
+
TOutput = TypeVar("TOutput")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class OperationOptions:
|
|
31
|
+
client: Client
|
|
32
|
+
use_dual_stack: bool | None = None
|
|
33
|
+
use_fips: bool | None = None
|
|
34
|
+
region: str | None = None
|
|
35
|
+
endpoint: str | None = None
|
|
36
|
+
retry_max_attempts: int | None = None
|
|
37
|
+
credentials_provider: IdentityProvider[Credentials] | None = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass
|
|
41
|
+
class AsyncOperationOptions:
|
|
42
|
+
client: AsyncClient
|
|
43
|
+
use_dual_stack: bool | None = None
|
|
44
|
+
use_fips: bool | None = None
|
|
45
|
+
region: str | None = None
|
|
46
|
+
endpoint: str | None = None
|
|
47
|
+
retry_max_attempts: int | None = None
|
|
48
|
+
credentials_provider: IdentityProvider[Credentials] | None = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class OperationRequest(Generic[TInput]):
|
|
53
|
+
input: TInput
|
|
54
|
+
options: OperationOptions
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class AsyncOperationRequest(Generic[TInput]):
|
|
59
|
+
input: TInput
|
|
60
|
+
options: AsyncOperationOptions
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@dataclass
|
|
64
|
+
class OperationResponse(Generic[TOutput]):
|
|
65
|
+
output: TOutput
|
|
66
|
+
response: Response
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass
|
|
70
|
+
class AsyncOperationResponse(Generic[TOutput]):
|
|
71
|
+
output: TOutput
|
|
72
|
+
response: Response
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
NextFn = Callable[
|
|
76
|
+
[OperationRequest[TInput]],
|
|
77
|
+
OperationResponse[TOutput],
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
AsyncNextFn = Callable[
|
|
81
|
+
[AsyncOperationRequest[TInput]],
|
|
82
|
+
Awaitable[AsyncOperationResponse[TOutput]],
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
Interceptor = Callable[
|
|
86
|
+
[OperationRequest[TInput], NextFn[TInput, TOutput]],
|
|
87
|
+
OperationResponse[TOutput],
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
AsyncInterceptor = Callable[
|
|
91
|
+
[AsyncOperationRequest[TInput], AsyncNextFn[TInput, TOutput]],
|
|
92
|
+
Awaitable[AsyncOperationResponse[TOutput]],
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def execute_pipeline(
|
|
97
|
+
request: OperationRequest[TInput],
|
|
98
|
+
handler: NextFn[TInput, TOutput],
|
|
99
|
+
interceptors: Sequence[Interceptor[TInput, TOutput]],
|
|
100
|
+
) -> OperationResponse[TOutput]:
|
|
101
|
+
def make_chain(index: int) -> NextFn[TInput, TOutput]:
|
|
102
|
+
if index < len(interceptors):
|
|
103
|
+
interceptor = interceptors[index]
|
|
104
|
+
|
|
105
|
+
def next_fn(req: OperationRequest[TInput]) -> OperationResponse[TOutput]:
|
|
106
|
+
return interceptor(req, make_chain(index + 1))
|
|
107
|
+
|
|
108
|
+
return next_fn
|
|
109
|
+
return handler
|
|
110
|
+
|
|
111
|
+
return make_chain(0)(request)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
async def aexecute_pipeline(
|
|
115
|
+
request: AsyncOperationRequest[TInput],
|
|
116
|
+
handler: AsyncNextFn[TInput, TOutput],
|
|
117
|
+
interceptors: Sequence[AsyncInterceptor[TInput, TOutput]],
|
|
118
|
+
) -> AsyncOperationResponse[TOutput]:
|
|
119
|
+
def make_chain(index: int) -> AsyncNextFn[TInput, TOutput]:
|
|
120
|
+
if index < len(interceptors):
|
|
121
|
+
interceptor = interceptors[index]
|
|
122
|
+
|
|
123
|
+
async def next_fn(
|
|
124
|
+
req: AsyncOperationRequest[TInput],
|
|
125
|
+
) -> AsyncOperationResponse[TOutput]:
|
|
126
|
+
return await interceptor(req, make_chain(index + 1))
|
|
127
|
+
|
|
128
|
+
return next_fn
|
|
129
|
+
return handler
|
|
130
|
+
|
|
131
|
+
return await make_chain(0)(request)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _is_retryable(exc: Exception) -> bool:
|
|
135
|
+
if isinstance(exc, ServiceError):
|
|
136
|
+
return exc.is_retryable
|
|
137
|
+
if isinstance(exc, SSLError):
|
|
138
|
+
return False
|
|
139
|
+
if isinstance(exc, (ConnectionError, TimeoutError)):
|
|
140
|
+
return True
|
|
141
|
+
return False
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _retry_delay(attempt: int, is_throttling: bool) -> float:
|
|
145
|
+
base = 1.0 if is_throttling else 0.5
|
|
146
|
+
delay = base * (2.0 ** min(attempt - 1, 10))
|
|
147
|
+
delay = min(20.0, delay)
|
|
148
|
+
return random.uniform(0.0, delay)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def retry() -> Interceptor[TInput, TOutput]:
|
|
152
|
+
def interceptor(
|
|
153
|
+
request: OperationRequest[TInput], next: NextFn[TInput, TOutput]
|
|
154
|
+
) -> OperationResponse[TOutput]:
|
|
155
|
+
max_attempts = request.options.retry_max_attempts or 3
|
|
156
|
+
last_exc: Exception | None = None
|
|
157
|
+
for attempt in range(1, max_attempts + 1):
|
|
158
|
+
try:
|
|
159
|
+
return next(request)
|
|
160
|
+
except Exception as exc:
|
|
161
|
+
if not _is_retryable(exc):
|
|
162
|
+
raise
|
|
163
|
+
last_exc = exc
|
|
164
|
+
if attempt < max_attempts:
|
|
165
|
+
is_throttling = (
|
|
166
|
+
isinstance(exc, ServiceError) and exc.is_throttling_error
|
|
167
|
+
)
|
|
168
|
+
time.sleep(_retry_delay(attempt, is_throttling))
|
|
169
|
+
|
|
170
|
+
assert last_exc
|
|
171
|
+
raise last_exc
|
|
172
|
+
|
|
173
|
+
return interceptor
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def aretry() -> AsyncInterceptor[TInput, TOutput]:
|
|
177
|
+
async def interceptor(
|
|
178
|
+
request: AsyncOperationRequest[TInput], next: AsyncNextFn[TInput, TOutput]
|
|
179
|
+
) -> AsyncOperationResponse[TOutput]:
|
|
180
|
+
max_attempts = request.options.retry_max_attempts or 3
|
|
181
|
+
last_exc: Exception | None = None
|
|
182
|
+
for attempt in range(1, max_attempts + 1):
|
|
183
|
+
try:
|
|
184
|
+
return await next(request)
|
|
185
|
+
except Exception as exc:
|
|
186
|
+
if not _is_retryable(exc):
|
|
187
|
+
raise
|
|
188
|
+
last_exc = exc
|
|
189
|
+
if attempt < max_attempts:
|
|
190
|
+
is_throttling = (
|
|
191
|
+
isinstance(exc, ServiceError) and exc.is_throttling_error
|
|
192
|
+
)
|
|
193
|
+
await anysleep(_retry_delay(attempt, is_throttling))
|
|
194
|
+
|
|
195
|
+
assert last_exc
|
|
196
|
+
raise last_exc
|
|
197
|
+
|
|
198
|
+
return interceptor
|