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.
Files changed (132) hide show
  1. capo_codeguru_security/__init__.py +74 -0
  2. capo_codeguru_security/_async.py +25 -0
  3. capo_codeguru_security/_auth/_identity.py +16 -0
  4. capo_codeguru_security/_auth/_providers.py +886 -0
  5. capo_codeguru_security/_auth/_signers.py +88 -0
  6. capo_codeguru_security/_auth/_sigv4.py +434 -0
  7. capo_codeguru_security/_auth/_zapros_handler.py +80 -0
  8. capo_codeguru_security/_iter.py +113 -0
  9. capo_codeguru_security/_operations/aws_code_guru_security/batch_get_findings.py +167 -0
  10. capo_codeguru_security/_operations/aws_code_guru_security/create_scan.py +183 -0
  11. capo_codeguru_security/_operations/aws_code_guru_security/create_upload_url.py +165 -0
  12. capo_codeguru_security/_operations/aws_code_guru_security/get_account_configuration.py +161 -0
  13. capo_codeguru_security/_operations/aws_code_guru_security/get_findings.py +191 -0
  14. capo_codeguru_security/_operations/aws_code_guru_security/get_metrics_summary.py +176 -0
  15. capo_codeguru_security/_operations/aws_code_guru_security/get_scan.py +173 -0
  16. capo_codeguru_security/_operations/aws_code_guru_security/list_findings_metrics.py +185 -0
  17. capo_codeguru_security/_operations/aws_code_guru_security/list_scans.py +167 -0
  18. capo_codeguru_security/_operations/aws_code_guru_security/list_tags_for_resource.py +173 -0
  19. capo_codeguru_security/_operations/aws_code_guru_security/tag_resource.py +173 -0
  20. capo_codeguru_security/_operations/aws_code_guru_security/untag_resource.py +171 -0
  21. capo_codeguru_security/_operations/aws_code_guru_security/update_account_configuration.py +172 -0
  22. capo_codeguru_security/_pagination.py +21 -0
  23. capo_codeguru_security/_protocol/__init__.py +1 -0
  24. capo_codeguru_security/_protocol/errors.py +93 -0
  25. capo_codeguru_security/_protocol/eventstream.py +238 -0
  26. capo_codeguru_security/_protocol/serialize.py +47 -0
  27. capo_codeguru_security/_protocol/xml.py +33 -0
  28. capo_codeguru_security/_rule_engine/__init__.py +0 -0
  29. capo_codeguru_security/_rule_engine/_aws_partition.py +160 -0
  30. capo_codeguru_security/_rule_engine/_endpoint_rule_set.py +137 -0
  31. capo_codeguru_security/_rule_engine/_endpoint_runtime.py +389 -0
  32. capo_codeguru_security/_services/_aws_config.py +160 -0
  33. capo_codeguru_security/_services/_pipeline.py +198 -0
  34. capo_codeguru_security/_services/async_code_guru_security.py +934 -0
  35. capo_codeguru_security/_services/code_guru_security.py +921 -0
  36. capo_codeguru_security/errors/__init__.py +33 -0
  37. capo_codeguru_security/errors/_base.py +94 -0
  38. capo_codeguru_security/errors/access_denied_exception.py +67 -0
  39. capo_codeguru_security/errors/conflict_exception.py +67 -0
  40. capo_codeguru_security/errors/internal_server_exception.py +53 -0
  41. capo_codeguru_security/errors/resource_not_found_exception.py +69 -0
  42. capo_codeguru_security/errors/throttling_exception.py +65 -0
  43. capo_codeguru_security/errors/validation_exception.py +98 -0
  44. capo_codeguru_security/py.typed +0 -0
  45. capo_codeguru_security/types/_prelude/blob.py +12 -0
  46. capo_codeguru_security/types/_prelude/timestamp.py +17 -0
  47. capo_codeguru_security/types/account_findings_metric.py +118 -0
  48. capo_codeguru_security/types/analysis_type.py +17 -0
  49. capo_codeguru_security/types/batch_get_findings_error.py +61 -0
  50. capo_codeguru_security/types/batch_get_findings_errors.py +35 -0
  51. capo_codeguru_security/types/batch_get_findings_request.py +47 -0
  52. capo_codeguru_security/types/batch_get_findings_response.py +61 -0
  53. capo_codeguru_security/types/categories_with_most_findings.py +37 -0
  54. capo_codeguru_security/types/category_with_finding_num.py +29 -0
  55. capo_codeguru_security/types/client_token.py +5 -0
  56. capo_codeguru_security/types/code_line.py +29 -0
  57. capo_codeguru_security/types/code_snippet.py +29 -0
  58. capo_codeguru_security/types/create_scan_request.py +101 -0
  59. capo_codeguru_security/types/create_scan_response.py +78 -0
  60. capo_codeguru_security/types/create_upload_url_request.py +31 -0
  61. capo_codeguru_security/types/create_upload_url_response.py +59 -0
  62. capo_codeguru_security/types/detector_tags.py +14 -0
  63. capo_codeguru_security/types/encryption_config.py +28 -0
  64. capo_codeguru_security/types/error_code.py +20 -0
  65. capo_codeguru_security/types/error_message.py +5 -0
  66. capo_codeguru_security/types/file_path.py +62 -0
  67. capo_codeguru_security/types/finding.py +207 -0
  68. capo_codeguru_security/types/finding_identifier.py +33 -0
  69. capo_codeguru_security/types/finding_identifiers.py +33 -0
  70. capo_codeguru_security/types/finding_metrics_value_per_severity.py +87 -0
  71. capo_codeguru_security/types/findings.py +29 -0
  72. capo_codeguru_security/types/findings_metric_list.py +35 -0
  73. capo_codeguru_security/types/get_account_configuration_request.py +18 -0
  74. capo_codeguru_security/types/get_account_configuration_response.py +45 -0
  75. capo_codeguru_security/types/get_findings_request.py +32 -0
  76. capo_codeguru_security/types/get_findings_response.py +43 -0
  77. capo_codeguru_security/types/get_metrics_summary_request.py +24 -0
  78. capo_codeguru_security/types/get_metrics_summary_response.py +42 -0
  79. capo_codeguru_security/types/get_scan_request.py +27 -0
  80. capo_codeguru_security/types/get_scan_response.py +132 -0
  81. capo_codeguru_security/types/header_key.py +5 -0
  82. capo_codeguru_security/types/header_value.py +5 -0
  83. capo_codeguru_security/types/kms_key_arn.py +5 -0
  84. capo_codeguru_security/types/list_findings_metrics_request.py +32 -0
  85. capo_codeguru_security/types/list_findings_metrics_response.py +49 -0
  86. capo_codeguru_security/types/list_scans_request.py +26 -0
  87. capo_codeguru_security/types/list_scans_response.py +43 -0
  88. capo_codeguru_security/types/list_tags_for_resource_request.py +24 -0
  89. capo_codeguru_security/types/list_tags_for_resource_response.py +34 -0
  90. capo_codeguru_security/types/metrics_summary.py +121 -0
  91. capo_codeguru_security/types/next_token.py +5 -0
  92. capo_codeguru_security/types/recommendation.py +29 -0
  93. capo_codeguru_security/types/reference_urls.py +14 -0
  94. capo_codeguru_security/types/related_vulnerabilities.py +14 -0
  95. capo_codeguru_security/types/remediation.py +63 -0
  96. capo_codeguru_security/types/request_header_map.py +29 -0
  97. capo_codeguru_security/types/resource.py +29 -0
  98. capo_codeguru_security/types/resource_id.py +32 -0
  99. capo_codeguru_security/types/s3_url.py +5 -0
  100. capo_codeguru_security/types/scan_name.py +5 -0
  101. capo_codeguru_security/types/scan_name_arn.py +5 -0
  102. capo_codeguru_security/types/scan_name_with_finding_num.py +29 -0
  103. capo_codeguru_security/types/scan_state.py +18 -0
  104. capo_codeguru_security/types/scan_summaries.py +29 -0
  105. capo_codeguru_security/types/scan_summary.py +99 -0
  106. capo_codeguru_security/types/scan_type.py +17 -0
  107. capo_codeguru_security/types/scans_with_most_open_critical_findings.py +37 -0
  108. capo_codeguru_security/types/scans_with_most_open_findings.py +37 -0
  109. capo_codeguru_security/types/severity.py +20 -0
  110. capo_codeguru_security/types/status.py +18 -0
  111. capo_codeguru_security/types/suggested_fix.py +29 -0
  112. capo_codeguru_security/types/suggested_fixes.py +31 -0
  113. capo_codeguru_security/types/tag_key.py +5 -0
  114. capo_codeguru_security/types/tag_key_list.py +17 -0
  115. capo_codeguru_security/types/tag_map.py +29 -0
  116. capo_codeguru_security/types/tag_resource_request.py +40 -0
  117. capo_codeguru_security/types/tag_resource_response.py +18 -0
  118. capo_codeguru_security/types/tag_value.py +5 -0
  119. capo_codeguru_security/types/untag_resource_request.py +27 -0
  120. capo_codeguru_security/types/untag_resource_response.py +18 -0
  121. capo_codeguru_security/types/update_account_configuration_request.py +45 -0
  122. capo_codeguru_security/types/update_account_configuration_response.py +45 -0
  123. capo_codeguru_security/types/uuid.py +5 -0
  124. capo_codeguru_security/types/validation_exception_field.py +33 -0
  125. capo_codeguru_security/types/validation_exception_field_list.py +37 -0
  126. capo_codeguru_security/types/validation_exception_reason.py +20 -0
  127. capo_codeguru_security/types/vulnerability.py +90 -0
  128. capo_codeguru_security-0.1.0.dist-info/METADATA +101 -0
  129. capo_codeguru_security-0.1.0.dist-info/RECORD +132 -0
  130. capo_codeguru_security-0.1.0.dist-info/WHEEL +5 -0
  131. capo_codeguru_security-0.1.0.dist-info/licenses/LICENSE +21 -0
  132. 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