checkov 3.2.332__py3-none-any.whl → 3.2.334__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.
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+
6
+ def build_definitions_context(definitions: dict[str, dict[str, Any]], definitions_raw: dict[str, list[tuple[int, str]]]
7
+ ) -> dict[str, dict[str, Any]]:
8
+ return {}
9
+
10
+
11
+ def add_resource_to_definitions_context(definitions_context: dict[str, dict[str, Any]], resource_key: str,
12
+ resource_attributes: dict[str, Any], definition_attribute: str,
13
+ definitions_raw: dict[str, Any], file_path: str) -> None:
14
+ pass
@@ -0,0 +1,55 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from pathlib import Path
5
+ from typing import Any, TYPE_CHECKING
6
+
7
+ from checkov.serverless.utils import ServerlessElements
8
+
9
+ if TYPE_CHECKING:
10
+ from checkov.serverless.graph_builder.graph_components.blocks import ServerlessBlock
11
+
12
+
13
+ def convert_graph_vertices_to_definitions(vertices: list[ServerlessBlock], root_folder: str | Path | None) \
14
+ -> tuple[dict[str, dict[str, Any]], dict[str, dict[str, Any]]]:
15
+ serverless_definitions: dict[str, dict[str, Any]] = {}
16
+ breadcrumbs: dict[str, dict[str, Any]] = {}
17
+ for vertex in vertices:
18
+ block_path = vertex.path
19
+ element_name = vertex.name.split('.')[-1]
20
+ # Plugins section is formatted as a list
21
+ if vertex.block_type == ServerlessElements.PLUGINS:
22
+ serverless_definitions.setdefault(block_path, {}).setdefault(vertex.block_type, []).append(element_name)
23
+
24
+ # If there is a ket named 'value' in the config it means that
25
+ # this vertex's config contains only a single string
26
+ elif 'value' in vertex.config:
27
+ # If the vertex is provider or service and it only contains a string the section should look like:
28
+ # provider: <value>
29
+ # service: <value>
30
+ if element_name == ServerlessElements.PROVIDER or element_name == ServerlessElements.SERVICE:
31
+ serverless_definitions.setdefault(block_path, {})[vertex.block_type] = vertex.config['value']
32
+
33
+ # Otherwise it's a vertex of a specific nested attribute and need to include the full path
34
+ # Examples:
35
+ # provider:
36
+ # runtime: nodejs20.x
37
+ # custom:
38
+ # myCustomVar: value
39
+ else:
40
+ serverless_definitions.setdefault(block_path, {}).setdefault(vertex.block_type, {})[element_name] = \
41
+ vertex.config['value']
42
+
43
+ # Otherwise, the vertex config is a dict
44
+ else:
45
+ serverless_definitions.setdefault(block_path, {}).setdefault(vertex.block_type, {})[
46
+ element_name] = vertex.config
47
+
48
+ if vertex.breadcrumbs:
49
+ relative_block_path = f"/{os.path.relpath(block_path, root_folder)}"
50
+ add_breadcrumbs(vertex, breadcrumbs, relative_block_path)
51
+ return serverless_definitions, breadcrumbs
52
+
53
+
54
+ def add_breadcrumbs(vertex: ServerlessBlock, breadcrumbs: dict[str, dict[str, Any]], relative_block_path: str) -> None:
55
+ breadcrumbs.setdefault(relative_block_path, {})[vertex.name] = vertex.breadcrumbs
@@ -2,8 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any
4
4
 
5
+ from checkov.common.graph.graph_builder import CustomAttributes
5
6
  from checkov.common.graph.graph_builder.local_graph import LocalGraph, _Block
7
+ from checkov.common.util.consts import LINE_FIELD_NAMES
8
+ from checkov.common.util.data_structures_utils import pickle_deepcopy
6
9
  from checkov.serverless.graph_builder.graph_components.blocks import ServerlessBlock
10
+ from checkov.serverless.utils import ServerlessElements
7
11
 
8
12
 
9
13
  class ServerlessLocalGraph(LocalGraph[ServerlessBlock]):
@@ -11,8 +15,86 @@ class ServerlessLocalGraph(LocalGraph[ServerlessBlock]):
11
15
  super().__init__()
12
16
  self.vertices: list[ServerlessBlock] = []
13
17
  self.definitions = definitions
14
- self.vertices_by_path_and_id: dict[tuple[str, str], int] = {}
15
- self.vertices_by_name: dict[str, int] = {}
18
+ self.vertices_by_path_and_name: dict[tuple[str, str], int] = {}
19
+
20
+ def build_graph(self, render_variables: bool = True) -> None:
21
+ self._create_vertices()
22
+
23
+ def _create_vertices(self) -> None:
24
+ for file_path, definition in self.definitions.items():
25
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.FUNCTIONS)
26
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.PARAMS)
27
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.PROVIDER)
28
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.LAYERS)
29
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.CUSTOM)
30
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.PACKAGE)
31
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.PLUGINS)
32
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.SERVICE)
33
+ self._create_vertex(file_path=file_path, definition=definition, element_type=ServerlessElements.RESOURCES)
34
+
35
+ for i, vertex in enumerate(self.vertices):
36
+ self.vertices_by_block_type[vertex.block_type].append(i)
37
+ self.vertices_by_path_and_name[(vertex.path, vertex.name)] = i
38
+
39
+ self.in_edges[i] = []
40
+ self.out_edges[i] = []
41
+
42
+ def _create_vertex(self, file_path: str, definition: dict[str, Any] | None,
43
+ element_type: ServerlessElements) -> None:
44
+ if not definition:
45
+ return
46
+ resources = definition.get(element_type)
47
+ if not resources:
48
+ return
49
+
50
+ elif isinstance(resources, str):
51
+ self.vertices.append(ServerlessBlock(
52
+ name=f'{element_type}',
53
+ config={"value": pickle_deepcopy(resources)},
54
+ path=file_path,
55
+ block_type=element_type,
56
+ attributes={"value": pickle_deepcopy(resources)},
57
+ id=f"{file_path}:{element_type}"
58
+ ))
59
+
60
+ else:
61
+ for attribute in resources:
62
+ if attribute in LINE_FIELD_NAMES:
63
+ continue
64
+
65
+ if isinstance(resources, list):
66
+ full_conf = {"value": pickle_deepcopy(attribute)}
67
+ self.vertices.append(ServerlessBlock(
68
+ name=f'{element_type}.{attribute}',
69
+ config=full_conf,
70
+ path=file_path,
71
+ block_type=element_type,
72
+ attributes=full_conf,
73
+ id=f"{file_path}:{element_type}.{attribute}"
74
+ ))
75
+
76
+ else:
77
+ attribute_value = resources[attribute]
78
+ if not isinstance(attribute_value, dict):
79
+ full_conf = {"value": pickle_deepcopy(attribute_value)}
80
+ else:
81
+ full_conf = attribute_value
82
+
83
+ config = pickle_deepcopy(full_conf)
84
+
85
+ resource_type = element_type
86
+
87
+ attributes = pickle_deepcopy(config)
88
+ attributes[CustomAttributes.RESOURCE_TYPE] = resource_type
89
+
90
+ self.vertices.append(ServerlessBlock(
91
+ name=f'{resource_type}.{attribute}',
92
+ config=config,
93
+ path=file_path,
94
+ block_type=resource_type,
95
+ attributes=attributes,
96
+ id=f"{file_path}:{resource_type}.{attribute}"
97
+ ))
16
98
 
17
99
  def get_resources_types_in_graph(self) -> list[str]:
18
100
  # not used
@@ -25,6 +107,3 @@ class ServerlessLocalGraph(LocalGraph[ServerlessBlock]):
25
107
 
26
108
  def update_vertices_configs(self) -> None:
27
109
  pass
28
-
29
- def build_graph(self, render_variables: bool) -> None:
30
- pass
@@ -11,6 +11,8 @@ from checkov.cloudformation.context_parser import ContextParser as CfnContextPar
11
11
  from checkov.common.bridgecrew.check_type import CheckType
12
12
  from checkov.common.util.secrets import omit_secret_value_from_checks
13
13
  from checkov.serverless.base_registry import EntityDetails
14
+ from checkov.serverless.graph_builder.definition_context import build_definitions_context
15
+ from checkov.serverless.graph_builder.graph_to_definitions import convert_graph_vertices_to_definitions
14
16
  from checkov.serverless.graph_builder.local_graph import ServerlessLocalGraph
15
17
  from checkov.serverless.graph_manager import ServerlessGraphManager
16
18
  from checkov.serverless.parsers.context_parser import ContextParser as SlsContextParser, ContextParser
@@ -111,6 +113,17 @@ class Runner(BaseRunner[_ServerlessDefinitions, _ServerlessContext, ServerlessGr
111
113
  # Filter out empty files that have not been parsed successfully
112
114
  self.definitions = {k: v for k, v in definitions.items() if v}
113
115
  self.definitions_raw = {k: v for k, v in definitions_raw.items() if k in definitions.keys()}
116
+ self.context = build_definitions_context(definitions=self.definitions, definitions_raw=self.definitions_raw)
117
+
118
+ logging.info("Creating Serverless graph")
119
+ local_graph = self.graph_manager.build_graph_from_definitions(definitions=self.definitions)
120
+ logging.info("Successfully created Serverless graph")
121
+
122
+ self.graph_manager.save_graph(local_graph)
123
+ self.definitions, self.breadcrumbs = convert_graph_vertices_to_definitions(
124
+ vertices=local_graph.vertices,
125
+ root_folder=root_folder,
126
+ )
114
127
 
115
128
  self.pbar.initiate(len(self.definitions))
116
129
 
@@ -140,34 +153,34 @@ class Runner(BaseRunner[_ServerlessDefinitions, _ServerlessContext, ServerlessGr
140
153
  # "Complete" checks
141
154
  # NOTE: Ignore code content, no point in showing (could be long)
142
155
  file_abs_path = Path(sls_file).absolute()
143
- entity_lines_range, entity_code_lines = sls_context_parser.extract_code_lines(sls_file_data)
144
- if entity_lines_range:
145
- skipped_checks = CfnContextParser.collect_skip_comments(entity_code_lines or [])
146
- variable_evaluations: dict[str, Any] = {}
147
- entity = EntityDetails(sls_context_parser.provider_type, sls_file_data)
148
- results = complete_registry.scan(sls_file, entity, skipped_checks, runner_filter)
149
- tags = cfn_utils.get_resource_tags(entity, complete_registry) # type:ignore[arg-type]
150
- if results:
151
- for check, check_result in results.items():
152
- record = Record(check_id=check.id, check_name=check.name, check_result=check_result,
153
- code_block=[], # Don't show, could be large
154
- file_path=self.extract_file_path_from_abs_path(Path(sls_file)),
155
- file_line_range=entity_lines_range,
156
- resource="complete", # Weird, not sure what to put where
157
- evaluations=variable_evaluations,
158
- check_class=check.__class__.__module__,
159
- file_abs_path=str(file_abs_path),
160
- entity_tags=tags, severity=check.severity)
161
- record.set_guideline(check.guideline)
162
- report.add_record(record=record)
163
- else:
164
- report.extra_resources.add(
165
- ExtraResource(
166
- file_abs_path=str(file_abs_path),
167
- file_path=self.extract_file_path_from_abs_path(Path(sls_file)),
168
- resource="complete",
169
- )
156
+ entity_code_lines = self.definitions_raw[sls_file]
157
+ entity_lines_range = [1, len(entity_code_lines) - 1]
158
+ skipped_checks = CfnContextParser.collect_skip_comments(entity_code_lines or [])
159
+ variable_evaluations: dict[str, Any] = {}
160
+ entity = EntityDetails(sls_context_parser.provider_type, sls_file_data)
161
+ results = complete_registry.scan(sls_file, entity, skipped_checks, runner_filter)
162
+ tags = cfn_utils.get_resource_tags(entity, complete_registry) # type:ignore[arg-type]
163
+ if results:
164
+ for check, check_result in results.items():
165
+ record = Record(check_id=check.id, check_name=check.name, check_result=check_result,
166
+ code_block=[], # Don't show, could be large
167
+ file_path=self.extract_file_path_from_abs_path(Path(sls_file)),
168
+ file_line_range=entity_lines_range,
169
+ resource="complete", # Weird, not sure what to put where
170
+ evaluations=variable_evaluations,
171
+ check_class=check.__class__.__module__,
172
+ file_abs_path=str(file_abs_path),
173
+ entity_tags=tags, severity=check.severity)
174
+ record.set_guideline(check.guideline)
175
+ report.add_record(record=record)
176
+ else:
177
+ report.extra_resources.add(
178
+ ExtraResource(
179
+ file_abs_path=str(file_abs_path),
180
+ file_path=self.extract_file_path_from_abs_path(Path(sls_file)),
181
+ resource="complete",
170
182
  )
183
+ )
171
184
 
172
185
  def single_item_sections_checks(self,
173
186
  sls_file: str,
@@ -183,7 +196,8 @@ class Runner(BaseRunner[_ServerlessDefinitions, _ServerlessContext, ServerlessGr
183
196
  continue
184
197
  entity_lines_range, entity_code_lines = sls_context_parser.extract_code_lines(item_content)
185
198
  if not entity_lines_range:
186
- entity_lines_range, entity_code_lines = sls_context_parser.extract_code_lines(sls_file_data)
199
+ entity_code_lines = self.definitions_raw[sls_file]
200
+ entity_lines_range = [1, len(entity_code_lines) - 1]
187
201
 
188
202
  skipped_checks = CfnContextParser.collect_skip_comments(entity_code_lines or [])
189
203
  variable_evaluations: dict[str, Any] = {}
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import os
4
+ from enum import Enum
4
5
  from typing import Callable, Any
5
6
 
6
7
  from checkov.common.parallelizer.parallel_runner import parallel_runner
@@ -11,6 +12,22 @@ SLS_FILE_MASK = os.getenv(
11
12
  "CKV_SLS_FILE_MASK", "serverless.yml,serverless.yaml").split(",")
12
13
 
13
14
 
15
+ class ServerlessElements(str, Enum):
16
+ PARAMS = "params"
17
+ FUNCTIONS = "functions"
18
+ PROVIDER = "provider"
19
+ LAYERS = "layers"
20
+ CUSTOM = "custom"
21
+ PACKAGE = "package"
22
+ PLUGINS = "plugins"
23
+ SERVICE = "service"
24
+ RESOURCES = "resources"
25
+
26
+ def __str__(self) -> str:
27
+ # needed, because of a Python 3.11 change
28
+ return self.value
29
+
30
+
14
31
  def get_scannable_file_paths(root_folder: str | None = None, excluded_paths: list[str] | None = None) -> list[str]:
15
32
  files_list: list[str] = []
16
33
 
checkov/version.py CHANGED
@@ -1 +1 @@
1
- version = '3.2.332'
1
+ version = '3.2.334'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: checkov
3
- Version: 3.2.332
3
+ Version: 3.2.334
4
4
  Summary: Infrastructure as code static analysis
5
5
  Home-page: https://github.com/bridgecrewio/checkov
6
6
  Author: bridgecrew
@@ -9,7 +9,7 @@ checkov/logging_init.py,sha256=ImCCNBBSanaHEAKBNG_e1Qp3BI6Ez0BPTkbSsyDmxTU,1135
9
9
  checkov/main.py,sha256=YD0umx-YHhXnTd8peTimMfXqe1SRfTw0h6m-3EsdefI,47873
10
10
  checkov/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  checkov/runner_filter.py,sha256=GdzBc-ija2h-pkeAdX9NyvlW6IqcZ0JjvwYyPWZXIAM,21580
12
- checkov/version.py,sha256=i6pyJXrLP-mVqlJ5_a3qbRpPaRbKYbJSsor9LMqi5RY,20
12
+ checkov/version.py,sha256=83mWM7TS6nNpKOXWxc8eDyWuw4PRP0xghKRouDmsfd0,20
13
13
  checkov/ansible/__init__.py,sha256=hFBtNkREui5Ra8CnhV3kJX7AUSeZM0w9h7ClX3ZxSgo,45
14
14
  checkov/ansible/runner.py,sha256=Gf0J4K8jyR8-LkxOz7voPaRky-IWfWXyVbK-9CCFgh0,5578
15
15
  checkov/ansible/utils.py,sha256=VFD9x3_BgktbXJan1u_H1u1hFmxDEVXgNKXYJvIdP9s,7956
@@ -1400,8 +1400,8 @@ checkov/serverless/__init__.py,sha256=oUAn9dkSV07GfCKLSaqQANNJZwJn9j7kaVwDEBzAZr
1400
1400
  checkov/serverless/base_registry.py,sha256=X2mQAYcIiQscc1eazhtz2EWhdjQRi7Ep_kvFVhTfhm4,1970
1401
1401
  checkov/serverless/graph_manager.py,sha256=TNvJ5lGJMwoqluzzT9-zbmdNm2bN96_BrPiCOHPYCbk,1750
1402
1402
  checkov/serverless/registry.py,sha256=_Oh_DKa4lITlZnGlUJXR8WL2QM9R0-yp-zJNx4lKaLo,158
1403
- checkov/serverless/runner.py,sha256=Fa4l3ii02XxkTO1dewNwd4C0KmpwOC-_DmwEj0T0vHc,19224
1404
- checkov/serverless/utils.py,sha256=JyvBtSq_zpSv3v4DLfFsm4W_qUEGQzTMrPxuo3j1n38,1844
1403
+ checkov/serverless/runner.py,sha256=7LptCB2lYbwofmlHSPwB1ZDE6_QFeJLHdRJttXUKBvM,19921
1404
+ checkov/serverless/utils.py,sha256=jjMnYACz268bt0nRjv8eT-_lcRPBWulmo7g6BT12K4w,2232
1405
1405
  checkov/serverless/checks/__init__.py,sha256=tNuTOyQi1FcIiShwaMn2YYRApnAnPGrg42Tzt2DSTBg,391
1406
1406
  checkov/serverless/checks/base_function_check.py,sha256=Yrati_68MgPRgzL5nug6B5NNV0dfwlva4cGQOOcwMao,269
1407
1407
  checkov/serverless/checks/complete/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1433,9 +1433,10 @@ checkov/serverless/checks/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeR
1433
1433
  checkov/serverless/checks/service/base_service_check.py,sha256=lMs4ZPaBFo2OMYfdd8o7zGY61P52BdP79V0OgtPN-fE,1143
1434
1434
  checkov/serverless/checks/service/registry.py,sha256=KQuotQAjNFc-iNVvmDxf6NIsKJPeILIkbQAcwwDJK44,105
1435
1435
  checkov/serverless/graph_builder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1436
- checkov/serverless/graph_builder/local_graph.py,sha256=i6RQHhHAgBMsIUnrsGK2Q2fvXuV9Vox_4IPDJNJc91I,1017
1436
+ checkov/serverless/graph_builder/definition_context.py,sha256=P1eqPcq8v8hZ-jvd_BaKdvENfGREnEPTIT0Qv4XRuMw,577
1437
+ checkov/serverless/graph_builder/graph_to_definitions.py,sha256=vifgIIv3YXHQeTYwnIxjktFjLt-QdwnZPd70kIB93y8,2531
1438
+ checkov/serverless/graph_builder/local_graph.py,sha256=pfMESZfkBq-Tfk3MOiL04MsBqKV429Cyq6XchdzDp1k,4924
1437
1439
  checkov/serverless/graph_builder/graph_components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1438
- checkov/serverless/graph_builder/graph_components/block_types.py,sha256=8i6MybOM4GGdLipw1URMPnYsFTBLvCBzfdkviaF1D_0,347
1439
1440
  checkov/serverless/graph_builder/graph_components/blocks.py,sha256=82o4ChXHL3yCJsywKDxb49PJQhFm-Aa8_YgyOy5mZ4E,532
1440
1441
  checkov/serverless/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1441
1442
  checkov/serverless/parsers/context_parser.py,sha256=Xd9mQhQJ_mVi3srSxK_9Zudlc4KNTErMJZ5SJ32kgZ8,3586
@@ -2713,12 +2714,12 @@ checkov/yaml_doc/base_yaml_check.py,sha256=LbrPcztyZnm08sdj_l5KtgjqBNqlL580qFLc1
2713
2714
  checkov/yaml_doc/enums.py,sha256=U2IcWt-cFWu1tomKiXdNrRmgK3OwAZSkhOClNDyeY0A,158
2714
2715
  checkov/yaml_doc/registry.py,sha256=qpNeWr7CC63SWaT-_6qgx1pDJB3WSgsnSLwC6g7k34E,148
2715
2716
  checkov/yaml_doc/runner.py,sha256=wqKfpQwMp5SHaAA1vhPWysE_x_4ovHhFZZWuUd5xufo,5552
2716
- checkov-3.2.332.data/scripts/checkov,sha256=5DHGDk_bkcuYsKKhH0gx2PAwSYKgGyufRFnsgwFLdHU,231
2717
- checkov-3.2.332.data/scripts/checkov.cmd,sha256=jkySNCkwm1dkSBC8eCfrIz67ydiTKth3wls9vQMR0kk,957
2717
+ checkov-3.2.334.data/scripts/checkov,sha256=5DHGDk_bkcuYsKKhH0gx2PAwSYKgGyufRFnsgwFLdHU,231
2718
+ checkov-3.2.334.data/scripts/checkov.cmd,sha256=jkySNCkwm1dkSBC8eCfrIz67ydiTKth3wls9vQMR0kk,957
2718
2719
  sast_integration_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2719
2720
  sast_integration_tests/test_checkov_sast_report.py,sha256=JiJeK28cwB5nWZbT1P9vWVhy60e1EDIrK_aSZrwaRMg,2361
2720
- checkov-3.2.332.dist-info/LICENSE,sha256=6kUITFZ5KOxBFt9xcr66N0u_Z7yWwGo4Fx-vy0mjdRA,11348
2721
- checkov-3.2.332.dist-info/METADATA,sha256=vGoP_6WsPEHl8yO4PXqYUEFuj6Yab-cSXpue3hSzTNU,26087
2722
- checkov-3.2.332.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
2723
- checkov-3.2.332.dist-info/top_level.txt,sha256=8TtaYYl8EDyycGLDTcoOJvih-3aoa9L4XZDUCrtnMwk,53
2724
- checkov-3.2.332.dist-info/RECORD,,
2721
+ checkov-3.2.334.dist-info/LICENSE,sha256=6kUITFZ5KOxBFt9xcr66N0u_Z7yWwGo4Fx-vy0mjdRA,11348
2722
+ checkov-3.2.334.dist-info/METADATA,sha256=zic-GO0BwK5Zcby7EPxHeuRg--1iNM5vGCltK0JzaL8,26087
2723
+ checkov-3.2.334.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
2724
+ checkov-3.2.334.dist-info/top_level.txt,sha256=8TtaYYl8EDyycGLDTcoOJvih-3aoa9L4XZDUCrtnMwk,53
2725
+ checkov-3.2.334.dist-info/RECORD,,
@@ -1,12 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass
4
- from typing import Literal
5
-
6
- from checkov.common.graph.graph_builder.graph_components.block_types import BlockType as CommonBlockType
7
-
8
-
9
- @dataclass
10
- class BlockType(CommonBlockType):
11
- PROVIDER: Literal["provider"] = "provider"
12
- FUNCTIONS: Literal["functions"] = "functions"