devsecops-engine-tools 1.114.3__py3-none-any.whl → 1.115.1__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.

Potentially problematic release.


This version of devsecops-engine-tools might be problematic. Click here for more details.

@@ -306,6 +306,12 @@ class CheckovTool(ToolGateway):
306
306
  threads = []
307
307
  rules_run = {}
308
308
 
309
+ # Incluir reglas adicionales para serverless si se especifica en la configuración SERVERLESS_ADITIONAL_CHECKS
310
+ ADDITIONAL_CHECKS = config_tool[self.TOOL_CHECKOV].get("SERVERLESS_ADITIONAL_CHECKS", [])
311
+ if any(p.lower() in ["serverless", "all"] for p in platform_to_scan) and ADDITIONAL_CHECKS:
312
+ for additional_check_type in ADDITIONAL_CHECKS:
313
+ config_tool[self.TOOL_CHECKOV]["RULES"]["RULES_SERVERLESS"].update(config_tool[self.TOOL_CHECKOV]["RULES"][additional_check_type])
314
+
309
315
  # Configurar LOG_LEVEL si está definido
310
316
  log_level = config_tool[self.TOOL_CHECKOV].get("LOG_LEVEL")
311
317
  if log_level:
@@ -2,101 +2,101 @@ from marshmallow import Schema, fields, validate
2
2
 
3
3
 
4
4
  class FindingSerializer(Schema):
5
- active = fields.Bool(requeride=False)
6
- component_name = fields.Str(requeride=False)
7
- component_version = fields.Str(requeride=False)
8
- created = fields.Str(requeride=False)
9
- epss_score: fields.Int(requeride=False)
10
- epss_percentile: fields.Int(requeride=False)
11
- cvssv3 = fields.Str(requeride=False)
12
- cvssv3_score = fields.Int(requeride=False)
13
- cwe = fields.List(fields.Int, requeride=False)
14
- date = fields.Str(requeride=False)
15
- defect_review_requested_by = fields.List(fields.Int, requerided=False)
16
- description = fields.Str(requeride=False)
17
- duplicate = fields.Bool(requerided=False)
18
- duplicate_finding = fields.Int(requerided=False)
19
- dynamic_finding = fields.Bool(requerided=False)
20
- effort_for_fixing = fields.Str(requerided=False)
21
- endpoints = fields.List(fields.Int, requerided=False)
22
- false_p = fields.Bool(requerided=False)
23
- file_path = fields.Str(requeride=False)
24
- finding_group = fields.List(fields.Number, requerided=False)
25
- found_by = fields.List(fields.Int, requerided=False)
26
- has_jira = fields.Bool(requerided=False)
27
- has_tags = fields.Bool(requerided=False)
28
- hash_code = fields.Str(requeride=False)
29
- id = fields.List(fields.List(fields.Field()), requerided=False)
30
- impact = fields.Str(requeride=False)
31
- inherited_tags = fields.List(fields.List(fields.Field()), requeride=False)
32
- is_mitigated = fields.Bool(requerided=False)
33
- jira_change = fields.Str(requeride=False)
34
- jira_creation = fields.Str(requeride=False)
35
- last_reviewed = fields.Str(requeride=False)
36
- last_reviewed_by = fields.List(fields.Int, requeried=False)
37
- limit = fields.Int(requerided=False)
38
- mitigated = fields.Str(requeride=False)
39
- mitigated_by = fields.List(fields.Int, requerided=False)
40
- mitigation = fields.Str(requeride=False)
41
- nb_occurences = fields.List(fields.Int, requeride=False)
42
- not_tag = fields.Str(requeride=False)
43
- not_tags = fields.List(fields.Str, requerided=False)
44
- not_test__engagement__product__tags = fields.List(fields.Str, requerided=False)
45
- not_test__engagement__tags = fields.List(fields.Str, requerided=False)
46
- not_test__tags = fields.List(fields.Str, requerided=False)
47
- numerical_severity = fields.Str(requeride=False)
48
- offset = fields.Int(requerided=False)
49
- out_of_scope = fields.Bool(requerided=False)
50
- outside_of_sla = fields.Int(requerided=False)
51
- param = fields.Str(requeride=False)
52
- payload = fields.Str(requeride=False)
53
- planned_remediation_date = fields.Str(requeride=False)
54
- planned_remediation_version = fields.Str(requeride=False)
55
- prefetch = fields.List(fields.Str, requerided=False)
56
- product_name = fields.Str(requeride=False)
57
- product_name_contains = fields.Str(requeride=False)
58
- publish_date = fields.Str(requeride=False)
59
- references = fields.Str(requeride=False)
60
- related_fields = fields.Str(requeride=False)
61
- reporter = fields.List(fields.Int, requerided=False)
62
- review_request_by = fields.List(fields.Int, requerided=False)
63
- reviewers = fields.List(fields.Int, requerided=False)
64
- risk_accetance = fields.Int(requerided=False)
5
+ active = fields.Bool(required=False)
6
+ component_name = fields.Str(required=False)
7
+ component_version = fields.Str(required=False)
8
+ created = fields.Str(required=False)
9
+ epss_score = fields.Int(required=False)
10
+ epss_percentile = fields.Int(required=False)
11
+ cvssv3 = fields.Str(required=False)
12
+ cvssv3_score = fields.Int(required=False)
13
+ cwe = fields.List(fields.Int, required=False)
14
+ date = fields.Str(required=False)
15
+ defect_review_requested_by = fields.List(fields.Int, required=False)
16
+ description = fields.Str(required=False)
17
+ duplicate = fields.Bool(required=False)
18
+ duplicate_finding = fields.Int(required=False)
19
+ dynamic_finding = fields.Bool(required=False)
20
+ effort_for_fixing = fields.Str(required=False)
21
+ endpoints = fields.List(fields.Int, required=False)
22
+ false_p = fields.Bool(required=False)
23
+ file_path = fields.Str(required=False)
24
+ finding_group = fields.List(fields.Number, required=False)
25
+ found_by = fields.List(fields.Int, required=False)
26
+ has_jira = fields.Bool(required=False)
27
+ has_tags = fields.Bool(required=False)
28
+ hash_code = fields.Str(required=False)
29
+ id = fields.List(fields.List(fields.Field()), required=False)
30
+ impact = fields.Str(required=False)
31
+ inherited_tags = fields.List(fields.List(fields.Field()), required=False)
32
+ is_mitigated = fields.Bool(required=False)
33
+ jira_change = fields.Str(required=False)
34
+ jira_creation = fields.Str(required=False)
35
+ last_reviewed = fields.Str(required=False)
36
+ last_reviewed_by = fields.List(fields.Int, required=False)
37
+ limit = fields.Int(required=False)
38
+ mitigated = fields.Str(required=False)
39
+ mitigated_by = fields.List(fields.Int, required=False)
40
+ mitigation = fields.Str(required=False)
41
+ nb_occurences = fields.List(fields.Int, required=False)
42
+ not_tag = fields.Str(required=False)
43
+ not_tags = fields.List(fields.Str, required=False)
44
+ not_test__engagement__product__tags = fields.List(fields.Str, required=False)
45
+ not_test__engagement__tags = fields.List(fields.Str, required=False)
46
+ not_test__tags = fields.List(fields.Str, required=False)
47
+ numerical_severity = fields.Str(required=False)
48
+ offset = fields.Int(required=False)
49
+ out_of_scope = fields.Bool(required=False)
50
+ outside_of_sla = fields.Int(required=False)
51
+ param = fields.Str(required=False)
52
+ payload = fields.Str(required=False)
53
+ planned_remediation_date = fields.Str(required=False)
54
+ planned_remediation_version = fields.Str(required=False)
55
+ prefetch = fields.List(fields.Str, required=False)
56
+ product_name = fields.Str(required=False)
57
+ product_name_contains = fields.Str(required=False)
58
+ publish_date = fields.Str(required=False)
59
+ references = fields.Str(required=False)
60
+ related_fields = fields.Str(required=False)
61
+ reporter = fields.List(fields.Int, required=False)
62
+ review_request_by = fields.List(fields.Int, required=False)
63
+ reviewers = fields.List(fields.Int, required=False)
64
+ risk_accetance = fields.Int(required=False)
65
65
  risk_status = fields.Str(
66
66
  required=False, validate=validate.OneOf(["Risk Pending", "Risk Rejected", "Risk Expired", "Risk Accepted", "Risk Active", "Transfer Pending", "Transfer Rejected", "Transfer Expired", "Transfer Accepted", "On Whitelist", "On Blacklist"])
67
67
  )
68
- risk_accepted = fields.Bool(requerided=False)
69
- sast_sink_object = fields.Str(requeride=False)
70
- sast_source_object = fields.Str(requeride=False)
71
- scanner_confidence = fields.List(fields.Int, requerided=False)
72
- service = fields.Str(requeride=False)
73
- severity = fields.Str(requeride=False)
74
- severity_justification = fields.Str(requeride=False)
75
- sla_start_date = fields.Str(requeride=False)
76
- sonarqube_issue = fields.List(fields.Int, requerided=False)
77
- static_finding = fields.Bool(requerided=False)
78
- steps_to_reproduce = fields.Str(requeride=False)
79
- tag = fields.Str(requeride=False)
80
- tags = fields.Str(requeride=False)
81
- test = fields.Int(requerided=False)
82
- test__engagement = fields.List(fields.Int, requerided=False)
83
- test__engagement__product = fields.List(fields.Int, requerided=False)
84
- test__engagement__product__prod_type = fields.List(fields.Int, requerided=False)
85
- test__engagement__product__tags = fields.List(fields.Int, requerided=False)
86
- test__engagement__tags = fields.List(fields.Str, requerided=False)
87
- test__tags = fields.List(fields.Str, requerided=False)
88
- test__test_type = fields.List(fields.Int, requerided=False)
89
- title = fields.Str(requeride=False)
90
- under_defect_review = fields.Bool(requerided=False)
91
- under_review = fields.Bool(requerided=False)
92
- unique_id_from_tool = fields.Str(requeride=False)
93
- verified = fields.Bool(requerided=False)
94
- vuln_id_from_tool = fields.Str(requeride=False)
95
- vulnerability_id = fields.Str(requeride=False)
68
+ risk_accepted = fields.Bool(required=False)
69
+ sast_sink_object = fields.Str(required=False)
70
+ sast_source_object = fields.Str(required=False)
71
+ scanner_confidence = fields.List(fields.Int, required=False)
72
+ service = fields.Str(required=False)
73
+ severity = fields.Str(required=False)
74
+ severity_justification = fields.Str(required=False)
75
+ sla_start_date = fields.Str(required=False)
76
+ sonarqube_issue = fields.List(fields.Int, required=False)
77
+ static_finding = fields.Bool(required=False)
78
+ steps_to_reproduce = fields.Str(required=False)
79
+ tag = fields.Str(required=False)
80
+ tags = fields.Str(required=False)
81
+ test = fields.Int(required=False)
82
+ test__engagement = fields.List(fields.Int, required=False)
83
+ test__engagement__product = fields.List(fields.Int, required=False)
84
+ test__engagement__product__prod_type = fields.List(fields.Int, required=False)
85
+ test__engagement__product__tags = fields.List(fields.Int, required=False)
86
+ test__engagement__tags = fields.List(fields.Str, required=False)
87
+ test__tags = fields.List(fields.Str, required=False)
88
+ test__test_type = fields.List(fields.Int, required=False)
89
+ title = fields.Str(required=False)
90
+ under_defect_review = fields.Bool(required=False)
91
+ under_review = fields.Bool(required=False)
92
+ unique_id_from_tool = fields.Str(required=False)
93
+ verified = fields.Bool(required=False)
94
+ vuln_id_from_tool = fields.Str(required=False)
95
+ vulnerability_id = fields.Str(required=False)
96
96
 
97
97
 
98
98
  class FindingCloseSerializer(Schema):
99
- is_mitigated = fields.Bool(default=True, requerided=False)
100
- mitigated = fields.Bool(requerided=False)
99
+ is_mitigated = fields.Bool(required=False)
100
+ mitigated = fields.Bool(required=False)
101
101
  detail = fields.Str(required=False)
102
102
  message = fields.Str(required=False)
@@ -207,7 +207,7 @@ class ImportScanSerializer(Schema):
207
207
  tool_scm_configuration = fields.Int(required=False)
208
208
  code_app = fields.Str(required=False)
209
209
  # defect-dojo credential
210
- generate_auth_cmdb = fields.Bool(required=False, default=False)
210
+ generate_auth_cmdb = fields.Bool(required=False)
211
211
  auth_cmdb_request_response = fields.Dict(required=False)
212
212
  token_cmdb = fields.Str(required=False)
213
213
  host_cmdb = fields.Url(required=False)
@@ -225,7 +225,7 @@ class ImportScanSerializer(Schema):
225
225
  project_remote_config = fields.Str(required=False)
226
226
  # regulare expression
227
227
  expression = fields.Str(required=True)
228
- reimport_scan = fields.Bool(required=False, default=False)
228
+ reimport_scan = fields.Bool(required=False)
229
229
 
230
230
  @post_load
231
231
  def make_cmdb(self, data, **kwargs):
@@ -1 +1 @@
1
- version = '1.114.3'
1
+ version = '1.115.1'
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: devsecops-engine-tools
3
- Version: 1.114.3
3
+ Version: 1.115.1
4
4
  Summary: Tool for DevSecOps strategy
5
5
  Home-page: https://github.com/bancolombia/devsecops-engine-tools
6
6
  Author: Bancolombia DevSecOps Team
@@ -10,31 +10,40 @@ Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or l
10
10
  Classifier: Operating System :: OS Independent
11
11
  Requires-Python: >=3.9
12
12
  Description-Content-Type: text/markdown
13
- Requires-Dist: requests==2.32.4
14
- Requires-Dist: PyYAML==6.0.2
15
- Requires-Dist: pyfiglet==0.8.post1
16
- Requires-Dist: prettytable==3.10.2
13
+ Requires-Dist: requests==2.32.5
14
+ Requires-Dist: PyYAML==6.0.3
15
+ Requires-Dist: pyfiglet==1.0.4
16
+ Requires-Dist: prettytable==3.16.0
17
17
  Requires-Dist: azure-devops==7.1.0b4
18
- Requires-Dist: marshmallow==3.21.3
19
- Requires-Dist: pytz==2024.1
18
+ Requires-Dist: marshmallow==4.0.1
19
+ Requires-Dist: pytz==2025.2
20
20
  Requires-Dist: python-decouple==3.8
21
- Requires-Dist: requests-toolbelt==1.0.0
21
+ Requires-Dist: requests_toolbelt==1.0.0
22
22
  Requires-Dist: pexpect==4.9.0
23
- Requires-Dist: PyGithub==2.3.0
23
+ Requires-Dist: PyGithub==2.8.1
24
24
  Requires-Dist: distro==1.9.0
25
- Requires-Dist: boto3==1.34.157
25
+ Requires-Dist: boto3==1.35.49
26
26
  Requires-Dist: docker==7.1.0
27
- Requires-Dist: setuptools==75.3.2
28
- Requires-Dist: rich==13.9.4
27
+ Requires-Dist: setuptools==78.1.1
28
+ Requires-Dist: rich==14.1.0
29
29
  Requires-Dist: cpe==1.3.1
30
- Requires-Dist: packageurl-python==0.15.6
31
- Requires-Dist: ruamel.yaml==0.18.6
32
- Requires-Dist: Authlib==1.3.2
33
- Requires-Dist: PyJWT==2.9.0
34
- Requires-Dist: sympy==1.13.3
35
- Requires-Dist: urllib3<2.0.0
36
- Requires-Dist: holidays==0.58
30
+ Requires-Dist: packageurl-python==0.13.4
31
+ Requires-Dist: ruamel.yaml==0.18.15
32
+ Requires-Dist: Authlib==1.6.4
33
+ Requires-Dist: PyJWT==2.10.1
34
+ Requires-Dist: sympy==1.14.0
35
+ Requires-Dist: urllib3==1.26.20
36
+ Requires-Dist: holidays==0.81
37
37
  Requires-Dist: pyarrow==21.0.0
38
+ Dynamic: author
39
+ Dynamic: author-email
40
+ Dynamic: classifier
41
+ Dynamic: description
42
+ Dynamic: description-content-type
43
+ Dynamic: home-page
44
+ Dynamic: requires-dist
45
+ Dynamic: requires-python
46
+ Dynamic: summary
38
47
 
39
48
  # DevSecOps Engine Tools
40
49
 
@@ -1,5 +1,5 @@
1
1
  devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- devsecops_engine_tools/version.py,sha256=MHBeUFpOWQiMqVSxLu6VZYUTFQ2q1ctBV1h2xhNnJpg,20
2
+ devsecops_engine_tools/version.py,sha256=kzH917wpZdKH8UUxk89ZdlBUctv8hnspjgge94k18cM,20
3
3
  devsecops_engine_tools/engine_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  devsecops_engine_tools/engine_core/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  devsecops_engine_tools/engine_core/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -168,7 +168,7 @@ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters
168
168
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
169
169
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_config.py,sha256=TctUDUvNsErWQ7B41eYCJ0REzGTSyMXJl19mFu33Lv4,5245
170
170
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_deserealizator.py,sha256=oDvMC4M9jWU4q-kbq798hWeQc45oX8cXyzYl5jo-hsw,2034
171
- devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_tool.py,sha256=5r0eFp4xcpwcpTHHBpwWlOU8lbK4NHityCAyj9OoQsY,16765
171
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_tool.py,sha256=xyQfY5LZYz0dVYYqadqhg9pwZDxKUoKt5A3UkjLmkt0,17306
172
172
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
173
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/kics_deserealizator.py,sha256=hUc5Rl92Bq9UltXSbyWRWIa_2HDSd1oPBctAkeXcQKE,2147
174
174
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/kics_tool.py,sha256=lmHY1b2YYQ3YqUobNoZBlPu1UnRZIaqDZudThzUpTvo,10556
@@ -309,8 +309,8 @@ devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/__ini
309
309
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/finding.py,sha256=RinG3ISc-u_3VXVqntwdcQvZoQdmHPCvDHWSvnkCkcU,2619
310
310
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/import_scan.py,sha256=n-fvv5QzqGzOqZs1ScbjvhVSycz7STet4GR2JWCJWe4,5317
311
311
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
312
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/finding.py,sha256=4IQLjqgyImVdn8AxoU3UKgXnvU-F-x7Tm2bJdp6nHm4,5265
313
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/import_scan.py,sha256=XYhtsDaxPb_-cS-BTgOX22eOmXY1T8FjqZTcrS5ISqA,7676
312
+ devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/finding.py,sha256=xD1KwGEZOpBDvaVSVfUL_Y0RkcLg-y2tp7YUgKMhJsk,5119
313
+ devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/import_scan.py,sha256=lje1dW3s3UJocsTGslJqk8uA_tNsxc8zlU2VHz6YqYA,7646
314
314
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
315
315
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/cmdb.py,sha256=n4971S8KDbwR3jMgWFK-CTDrRb5ll7hzr3a4CEoqRX0,2625
316
316
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/component.py,sha256=_icc-ZAqw-aVgE5J4VH8Q7fSqpCgEGcfmurgRIN9NqM,448
@@ -383,8 +383,8 @@ devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGax
383
383
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
384
384
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=Z0fdhB3r-dxU0nGSD9zW_B4r2Qol1rUnUCkhFR0U-HQ,487
385
385
  devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=HCjS900TBoNcHrC4LaiP-Kf9frVdtagF130qOUgnO2M,6757
386
- devsecops_engine_tools-1.114.3.dist-info/METADATA,sha256=NfLzfg8ht0nWEQmV_c1xSwNi-sa35GSN7lanpNR2M4U,3233
387
- devsecops_engine_tools-1.114.3.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
388
- devsecops_engine_tools-1.114.3.dist-info/entry_points.txt,sha256=OWAww5aBsGeMv0kWhSgVNB0ySKKpYuJd4dly0ikFPkc,283
389
- devsecops_engine_tools-1.114.3.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
390
- devsecops_engine_tools-1.114.3.dist-info/RECORD,,
386
+ devsecops_engine_tools-1.115.1.dist-info/METADATA,sha256=QEPvXuzaALUwHc9AbWxEGAjCq7pWLS1uPOa_28M3-Kk,3429
387
+ devsecops_engine_tools-1.115.1.dist-info/WHEEL,sha256=lTU6B6eIfYoiQJTZNc-fyaR6BpL6ehTzU3xGYxn2n8k,91
388
+ devsecops_engine_tools-1.115.1.dist-info/entry_points.txt,sha256=OWAww5aBsGeMv0kWhSgVNB0ySKKpYuJd4dly0ikFPkc,283
389
+ devsecops_engine_tools-1.115.1.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
390
+ devsecops_engine_tools-1.115.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.2)
2
+ Generator: setuptools (78.1.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5