cycode 2.2.1.dev3__py3-none-any.whl → 2.2.1.dev5__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.
cycode/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.2.1.dev3' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
1
+ __version__ = '2.2.1.dev5' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
@@ -13,6 +13,7 @@ from cycode.cli.config import config
13
13
  from cycode.cli.consts import (
14
14
  ISSUE_DETECTED_STATUS_CODE,
15
15
  NO_ISSUES_STATUS_CODE,
16
+ SCA_GRADLE_ALL_SUB_PROJECTS_FLAG,
16
17
  SCA_SKIP_RESTORE_DEPENDENCIES_FLAG,
17
18
  )
18
19
  from cycode.cli.models import Severity
@@ -110,6 +111,15 @@ from cycode.cli.utils.get_api_client import get_scan_cycode_client
110
111
  type=bool,
111
112
  required=False,
112
113
  )
114
+ @click.option(
115
+ f'--{SCA_GRADLE_ALL_SUB_PROJECTS_FLAG}',
116
+ is_flag=True,
117
+ default=False,
118
+ help='When specified, Cycode will run gradle restore command for all sub projects. '
119
+ 'Should run from root project directory ONLY!',
120
+ type=bool,
121
+ required=False,
122
+ )
113
123
  @click.pass_context
114
124
  def scan_command(
115
125
  context: click.Context,
@@ -124,6 +134,7 @@ def scan_command(
124
134
  report: bool,
125
135
  no_restore: bool,
126
136
  sync: bool,
137
+ gradle_all_sub_projects: bool,
127
138
  ) -> int:
128
139
  """Scans for Secrets, IaC, SCA or SAST violations."""
129
140
  add_breadcrumb('scan')
@@ -145,6 +156,7 @@ def scan_command(
145
156
  context.obj['monitor'] = monitor
146
157
  context.obj['report'] = report
147
158
  context.obj[SCA_SKIP_RESTORE_DEPENDENCIES_FLAG] = no_restore
159
+ context.obj[SCA_GRADLE_ALL_SUB_PROJECTS_FLAG] = gradle_all_sub_projects
148
160
 
149
161
  _sca_scan_to_context(context, sca_scan)
150
162
 
cycode/cli/consts.py CHANGED
@@ -224,3 +224,5 @@ PACKAGE_VULNERABILITY_POLICY_ID = '9369d10a-9ac0-48d3-9921-5de7fe9a37a7'
224
224
  SCA_SHORTCUT_DEPENDENCY_PATHS = 2
225
225
 
226
226
  SCA_SKIP_RESTORE_DEPENDENCIES_FLAG = 'no-restore'
227
+
228
+ SCA_GRADLE_ALL_SUB_PROJECTS_FLAG = 'gradle-all-sub-projects'
@@ -1,28 +1,70 @@
1
1
  import os
2
- from typing import List
2
+ import re
3
+ from typing import List, Optional, Set
3
4
 
4
5
  import click
5
6
 
7
+ from cycode.cli.consts import SCA_GRADLE_ALL_SUB_PROJECTS_FLAG
6
8
  from cycode.cli.files_collector.sca.base_restore_dependencies import BaseRestoreDependencies
7
9
  from cycode.cli.models import Document
10
+ from cycode.cli.utils.path_utils import get_path_from_context
11
+ from cycode.cli.utils.shell_executor import shell
8
12
 
9
13
  BUILD_GRADLE_FILE_NAME = 'build.gradle'
10
14
  BUILD_GRADLE_KTS_FILE_NAME = 'build.gradle.kts'
11
15
  BUILD_GRADLE_DEP_TREE_FILE_NAME = 'gradle-dependencies-generated.txt'
16
+ BUILD_GRADLE_ALL_PROJECTS_TIMEOUT = 180
17
+ BUILD_GRADLE_ALL_PROJECTS_COMMAND = ['gradle', 'projects']
18
+ ALL_PROJECTS_REGEX = r"[+-]{3} Project '(.*?)'"
12
19
 
13
20
 
14
21
  class RestoreGradleDependencies(BaseRestoreDependencies):
15
- def __init__(self, context: click.Context, is_git_diff: bool, command_timeout: int) -> None:
22
+ def __init__(
23
+ self, context: click.Context, is_git_diff: bool, command_timeout: int, projects: Optional[Set[str]] = None
24
+ ) -> None:
16
25
  super().__init__(context, is_git_diff, command_timeout, create_output_file_manually=True)
26
+ if projects is None:
27
+ projects = set()
28
+ self.projects = self.get_all_projects() if self.is_gradle_sub_projects() else projects
29
+
30
+ def is_gradle_sub_projects(self) -> bool:
31
+ return self.context.obj.get(SCA_GRADLE_ALL_SUB_PROJECTS_FLAG)
17
32
 
18
33
  def is_project(self, document: Document) -> bool:
19
34
  return document.path.endswith(BUILD_GRADLE_FILE_NAME) or document.path.endswith(BUILD_GRADLE_KTS_FILE_NAME)
20
35
 
21
36
  def get_commands(self, manifest_file_path: str) -> List[List[str]]:
22
- return [['gradle', 'dependencies', '-b', manifest_file_path, '-q', '--console', 'plain']]
37
+ return (
38
+ self.get_commands_for_sub_projects(manifest_file_path)
39
+ if self.is_gradle_sub_projects()
40
+ else [['gradle', 'dependencies', '-b', manifest_file_path, '-q', '--console', 'plain']]
41
+ )
23
42
 
24
43
  def get_lock_file_name(self) -> str:
25
44
  return BUILD_GRADLE_DEP_TREE_FILE_NAME
26
45
 
27
46
  def verify_restore_file_already_exist(self, restore_file_path: str) -> bool:
28
47
  return os.path.isfile(restore_file_path)
48
+
49
+ def get_working_directory(self, document: Document) -> Optional[str]:
50
+ return get_path_from_context(self.context) if self.is_gradle_sub_projects() else None
51
+
52
+ def get_all_projects(self) -> Set[str]:
53
+ projects_output = shell(
54
+ command=BUILD_GRADLE_ALL_PROJECTS_COMMAND,
55
+ timeout=BUILD_GRADLE_ALL_PROJECTS_TIMEOUT,
56
+ working_directory=get_path_from_context(self.context),
57
+ )
58
+
59
+ projects = re.findall(ALL_PROJECTS_REGEX, projects_output)
60
+
61
+ return set(projects)
62
+
63
+ def get_commands_for_sub_projects(self, manifest_file_path: str) -> List[List[str]]:
64
+ project_name = os.path.basename(os.path.dirname(manifest_file_path))
65
+ project_name = f':{project_name}'
66
+ return (
67
+ [['gradle', f'{project_name}:dependencies', '-q', '--console', 'plain']]
68
+ if project_name in self.projects
69
+ else []
70
+ )
@@ -50,7 +50,8 @@ def run_parallel_batched_scan(
50
50
  progress_bar: 'BaseProgressBar',
51
51
  ) -> Tuple[Dict[str, 'CliError'], List['LocalScanResult']]:
52
52
  max_size = consts.SCAN_BATCH_MAX_SIZE_IN_BYTES.get(scan_type, consts.DEFAULT_SCAN_BATCH_MAX_SIZE_IN_BYTES)
53
- batches = split_documents_into_batches(documents, max_size)
53
+
54
+ batches = [documents] if scan_type == consts.SCA_SCAN_TYPE else split_documents_into_batches(documents, max_size)
54
55
 
55
56
  progress_bar.set_section_length(ScanProgressBarSection.SCAN, len(batches)) # * 3
56
57
  # TODO(MarshalX): we should multiply the count of batches in SCAN section because each batch has 3 steps:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cycode
3
- Version: 2.2.1.dev3
3
+ Version: 2.2.1.dev5
4
4
  Summary: Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning.
5
5
  Home-page: https://github.com/cycodehq/cycode-cli
6
6
  License: MIT
@@ -1,4 +1,4 @@
1
- cycode/__init__.py,sha256=vpHVIjFbUE0HZ1vNee8RWTjIDx4aPXE7TjY-L3UxHpw,114
1
+ cycode/__init__.py,sha256=BXfQCIcXTm0oKsiPsG0UvgekX7s2gAsCYRSvOjdsLaI,114
2
2
  cycode/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  cycode/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  cycode/cli/commands/ai_remediation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -37,7 +37,7 @@ cycode/cli/commands/scan/repository/repository_command.py,sha256=xH6PPXweenHOll7
37
37
  cycode/cli/commands/scan/scan_ci/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  cycode/cli/commands/scan/scan_ci/ci_integrations.py,sha256=bbttv1pI8C2jQWtvt_mzypFEVi2iTI9TV0xfeIgrs5M,1588
39
39
  cycode/cli/commands/scan/scan_ci/scan_ci_command.py,sha256=wTjNt06gWgNoehg1ueHf9eAXseGE8pUb6wL1_vrIU5w,622
40
- cycode/cli/commands/scan/scan_command.py,sha256=mLyksWNm40nJiP6iV8yNwFfpstx3uN5r3Tr53tfkDjs,5215
40
+ cycode/cli/commands/scan/scan_command.py,sha256=BIwO-gARF3gv75T9sML9ewq8MiSFgWn5K4zzd7E1k60,5639
41
41
  cycode/cli/commands/status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  cycode/cli/commands/status/status_command.py,sha256=DlIHHLv7CgmlXd6Kn9p26VF0TfRUmhGKLFc3FUEPQOo,4295
43
43
  cycode/cli/commands/version/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -45,7 +45,7 @@ cycode/cli/commands/version/version_checker.py,sha256=fuT_REPWh_eQW7OTBETgdeXMa5
45
45
  cycode/cli/commands/version/version_command.py,sha256=CdLccqFoK3_yE13H7QUpxjsEZltke1emN-_qHHpnghU,555
46
46
  cycode/cli/config.py,sha256=JR_-uZdWVV-AaffRqTbDH0V7O4KLGNKn50v3huuPlts,466
47
47
  cycode/cli/config.yaml,sha256=SBs5VNdaY9BVbRlwgnTF_j53GBbjJVwwBj9qx_qvrds,463
48
- cycode/cli/consts.py,sha256=Tqzme0tesEEWOd30fJgSwmpIo-ITb9tHXhc_xrpIoDA,6985
48
+ cycode/cli/consts.py,sha256=7zIQ3ff_b6Sn7-LwV0RPZ7qRbQ20OnKQcgdgenhHoWU,7047
49
49
  cycode/cli/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  cycode/cli/exceptions/common.py,sha256=Si_e8bn_VfsnCww_eN1czF9iBPbQZxS8L8Oy4YoA0cA,954
51
51
  cycode/cli/exceptions/custom_exceptions.py,sha256=7HiXUoh0lnIP7yUwO-lv1p9AXiMU2bIJdlUvu9H6CKY,3466
@@ -65,7 +65,7 @@ cycode/cli/files_collector/sca/base_restore_dependencies.py,sha256=fQBfwKKMym3iY
65
65
  cycode/cli/files_collector/sca/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  cycode/cli/files_collector/sca/go/restore_go_dependencies.py,sha256=Hz5yysoeS54gX02FY9aysFSOKb3Tl7IH4VqD6ImOPL8,2010
67
67
  cycode/cli/files_collector/sca/maven/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py,sha256=GHucXSEYG6zS3T3k-clioggTPO2Bk4g6jVuo-_sOXNc,1157
68
+ cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py,sha256=AVW_WAkmm8jOxjd2KvRTFaRWS3Pk1fjwMpnnLBN8cnM,2884
69
69
  cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py,sha256=aJo8yGJJVGGOq4v2_BX-OFk0m5IPXZOE6Z88weJtC-c,3146
70
70
  cycode/cli/files_collector/sca/npm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  cycode/cli/files_collector/sca/npm/restore_npm_dependencies.py,sha256=-HSuuRNyGZRCVL3GCm0WXGoE7ovTHCGJXr7nnzVjwko,1428
@@ -106,7 +106,7 @@ cycode/cli/utils/ignore_utils.py,sha256=zQqRS_SmuFZfTwmRGnYJHd9lIolYoGDgSAiAIZmr
106
106
  cycode/cli/utils/jwt_utils.py,sha256=M7UxRHQQ1xsWxg0b1Lo85eQxhnhfgBJB4xpe1Y_JZZs,544
107
107
  cycode/cli/utils/path_utils.py,sha256=TqyH-kZxEQHa6rVygr8yBy0fbXSwNu34-ifIKM4n-os,3114
108
108
  cycode/cli/utils/progress_bar.py,sha256=OMG_JF5xIScDvqeOuHcEr6kPcYR1D8n9hzD64uq_-EI,9884
109
- cycode/cli/utils/scan_batch.py,sha256=TXEkujV6wqaLyC_FNNtc5LYp-ogFIAxc2kqt1yAB4Tw,2701
109
+ cycode/cli/utils/scan_batch.py,sha256=5xU8SdfKVEKGzqoo4q16Bg8jvvThivCxyImyvbbOQ2A,2756
110
110
  cycode/cli/utils/scan_utils.py,sha256=d3Cysjagh0RRbIXNmt0rQfgDTtZBJKO9TLntC6CuPbQ,334
111
111
  cycode/cli/utils/shell_executor.py,sha256=jmD8El3wzkLaGwf3iHjbfFhd6Z9MOs9F7sLuIP9MiKg,935
112
112
  cycode/cli/utils/string_utils.py,sha256=W4TMXOQP_PpAfOYemWkUK1TeW_TkQDBCHeTeL0Olcsk,2034
@@ -127,8 +127,8 @@ cycode/cyclient/models.py,sha256=iUrTtQrIvls1kgtOadCa8QPzsvh8_kj2eZIX73FIIpk,143
127
127
  cycode/cyclient/report_client.py,sha256=sNLOm64oaONz-TUBs6fpFfbb7RfxALPS6YBqadMo2-8,3971
128
128
  cycode/cyclient/scan_client.py,sha256=kgtGsxW-7Y_7hlS1ZY0O5xcRm8i3PvRp84PgEWlhD_0,14772
129
129
  cycode/cyclient/scan_config_base.py,sha256=JqoC8C8164IuFrhJe540bPWf6_iQOZ2SJXGud72COwo,1780
130
- cycode-2.2.1.dev3.dist-info/LICENCE,sha256=2Wx4N6mD_4xB7-E3hPkZ3MPhpJy__k_I8MaCSO-PDRo,1068
131
- cycode-2.2.1.dev3.dist-info/METADATA,sha256=JF5gXu-j65pl0IjE45PWg-qKh688TB0Ud4VMxiqjCFo,45725
132
- cycode-2.2.1.dev3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
133
- cycode-2.2.1.dev3.dist-info/entry_points.txt,sha256=GKZlS6LtUdABDPd7-o9bwNSI5gYQnyA3qGrFFQKt3Vc,51
134
- cycode-2.2.1.dev3.dist-info/RECORD,,
130
+ cycode-2.2.1.dev5.dist-info/LICENCE,sha256=2Wx4N6mD_4xB7-E3hPkZ3MPhpJy__k_I8MaCSO-PDRo,1068
131
+ cycode-2.2.1.dev5.dist-info/METADATA,sha256=edAYrHNI3PDEQYRCFnWJ5iRpJJUgS48anTCDckPq8H4,45725
132
+ cycode-2.2.1.dev5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
133
+ cycode-2.2.1.dev5.dist-info/entry_points.txt,sha256=GKZlS6LtUdABDPd7-o9bwNSI5gYQnyA3qGrFFQKt3Vc,51
134
+ cycode-2.2.1.dev5.dist-info/RECORD,,