cycode 3.5.2.dev1__tar.gz → 3.5.3.dev1__tar.gz

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 (167) hide show
  1. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/PKG-INFO +1 -1
  2. cycode-3.5.3.dev1/cycode/__init__.py +1 -0
  3. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/sbom/path/path_command.py +6 -1
  4. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/code_scanner.py +12 -2
  5. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/commit_range_scanner.py +40 -1
  6. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/repository/repository_command.py +5 -0
  7. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/scan_command.py +8 -1
  8. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/consts.py +2 -0
  9. cycode-3.5.3.dev1/cycode/cli/files_collector/documents_walk_ignore.py +124 -0
  10. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/path_documents.py +24 -7
  11. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/walk_ignore.py +14 -5
  12. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/scan_utils.py +7 -1
  13. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/models.py +2 -0
  14. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/scan_client.py +10 -3
  15. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/pyproject.toml +1 -1
  16. cycode-3.5.2.dev1/cycode/__init__.py +0 -1
  17. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/LICENCE +0 -0
  18. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/README.md +0 -0
  19. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/__main__.py +0 -0
  20. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/__init__.py +0 -0
  21. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/app.py +0 -0
  22. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/__init__.py +0 -0
  23. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/ai_remediation/__init__.py +0 -0
  24. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/ai_remediation/ai_remediation_command.py +0 -0
  25. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/ai_remediation/apply_fix.py +0 -0
  26. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/ai_remediation/print_remediation.py +0 -0
  27. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/auth/__init__.py +0 -0
  28. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/auth/auth_command.py +0 -0
  29. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/auth/auth_common.py +0 -0
  30. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/auth/auth_manager.py +0 -0
  31. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/auth/models.py +0 -0
  32. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/configure/__init__.py +0 -0
  33. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/configure/configure_command.py +0 -0
  34. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/configure/consts.py +0 -0
  35. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/configure/messages.py +0 -0
  36. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/configure/prompts.py +0 -0
  37. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/ignore/__init__.py +0 -0
  38. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/ignore/ignore_command.py +0 -0
  39. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/mcp/__init__.py +0 -0
  40. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/mcp/mcp_command.py +0 -0
  41. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/__init__.py +0 -0
  42. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/report_command.py +0 -0
  43. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/sbom/__init__.py +0 -0
  44. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/sbom/common.py +0 -0
  45. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/sbom/path/__init__.py +0 -0
  46. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/sbom/repository_url/__init__.py +0 -0
  47. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/sbom/repository_url/repository_url_command.py +0 -0
  48. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/sbom/sbom_command.py +0 -0
  49. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/report/sbom/sbom_report_file.py +0 -0
  50. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/__init__.py +0 -0
  51. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/aggregation_report.py +0 -0
  52. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/commit_history/__init__.py +0 -0
  53. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/commit_history/commit_history_command.py +0 -0
  54. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/detection_excluder.py +0 -0
  55. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/path/__init__.py +0 -0
  56. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/path/path_command.py +0 -0
  57. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/pre_commit/__init__.py +0 -0
  58. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/pre_commit/pre_commit_command.py +0 -0
  59. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/pre_push/__init__.py +0 -0
  60. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/pre_push/pre_push_command.py +0 -0
  61. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/pre_receive/__init__.py +0 -0
  62. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +0 -0
  63. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/remote_url_resolver.py +0 -0
  64. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/repository/__init__.py +0 -0
  65. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/scan_ci/__init__.py +0 -0
  66. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/scan_ci/ci_integrations.py +0 -0
  67. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/scan_ci/scan_ci_command.py +0 -0
  68. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/scan_parameters.py +0 -0
  69. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/scan/scan_result.py +0 -0
  70. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/status/__init__.py +0 -0
  71. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/status/get_cli_status.py +0 -0
  72. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/status/models.py +0 -0
  73. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/status/status_command.py +0 -0
  74. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/apps/status/version_command.py +0 -0
  75. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/cli_types.py +0 -0
  76. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/config.py +0 -0
  77. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/console.py +0 -0
  78. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/exceptions/__init__.py +0 -0
  79. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/exceptions/custom_exceptions.py +0 -0
  80. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/exceptions/handle_ai_remediation_errors.py +0 -0
  81. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/exceptions/handle_auth_errors.py +0 -0
  82. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/exceptions/handle_errors.py +0 -0
  83. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/exceptions/handle_report_sbom_errors.py +0 -0
  84. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/exceptions/handle_scan_errors.py +0 -0
  85. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/__init__.py +0 -0
  86. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/commit_range_documents.py +0 -0
  87. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/file_excluder.py +0 -0
  88. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/iac/__init__.py +0 -0
  89. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/iac/tf_content_generator.py +0 -0
  90. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/models/__init__.py +0 -0
  91. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/models/in_memory_zip.py +0 -0
  92. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/repository_documents.py +0 -0
  93. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/__init__.py +0 -0
  94. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/base_restore_dependencies.py +0 -0
  95. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/go/__init__.py +0 -0
  96. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/go/restore_go_dependencies.py +0 -0
  97. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/maven/__init__.py +0 -0
  98. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py +0 -0
  99. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py +0 -0
  100. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/npm/__init__.py +0 -0
  101. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/npm/restore_npm_dependencies.py +0 -0
  102. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/nuget/__init__.py +0 -0
  103. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/nuget/restore_nuget_dependencies.py +0 -0
  104. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/ruby/__init__.py +0 -0
  105. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/ruby/restore_ruby_dependencies.py +0 -0
  106. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/sbt/__init__.py +0 -0
  107. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/sbt/restore_sbt_dependencies.py +0 -0
  108. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/sca/sca_file_collector.py +0 -0
  109. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/files_collector/zip_documents.py +0 -0
  110. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/logger.py +0 -0
  111. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/main.py +0 -0
  112. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/models.py +0 -0
  113. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/__init__.py +0 -0
  114. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/console_printer.py +0 -0
  115. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/json_printer.py +0 -0
  116. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/printer_base.py +0 -0
  117. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/rich_printer.py +0 -0
  118. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/tables/__init__.py +0 -0
  119. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/tables/sca_table_printer.py +0 -0
  120. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/tables/table.py +0 -0
  121. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/tables/table_models.py +0 -0
  122. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/tables/table_printer.py +0 -0
  123. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/tables/table_printer_base.py +0 -0
  124. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/text_printer.py +0 -0
  125. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/utils/__init__.py +0 -0
  126. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/utils/code_snippet_syntax.py +0 -0
  127. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/utils/detection_data.py +0 -0
  128. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/utils/detection_ordering/__init__.py +0 -0
  129. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/utils/detection_ordering/common_ordering.py +0 -0
  130. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/utils/detection_ordering/sca_ordering.py +0 -0
  131. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/printers/utils/rich_helpers.py +0 -0
  132. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/user_settings/__init__.py +0 -0
  133. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/user_settings/base_file_manager.py +0 -0
  134. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/user_settings/config_file_manager.py +0 -0
  135. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/user_settings/configuration_manager.py +0 -0
  136. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/user_settings/credentials_manager.py +0 -0
  137. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/user_settings/jwt_creator.py +0 -0
  138. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/__init__.py +0 -0
  139. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/enum_utils.py +0 -0
  140. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/get_api_client.py +0 -0
  141. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/git_proxy.py +0 -0
  142. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/ignore_utils.py +0 -0
  143. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/jwt_utils.py +0 -0
  144. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/path_utils.py +0 -0
  145. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/progress_bar.py +0 -0
  146. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/scan_batch.py +0 -0
  147. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/sentry.py +0 -0
  148. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/shell_executor.py +0 -0
  149. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/string_utils.py +0 -0
  150. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/task_timer.py +0 -0
  151. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/version_checker.py +0 -0
  152. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cli/utils/yaml_utils.py +0 -0
  153. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/config.py +0 -0
  154. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/__init__.py +0 -0
  155. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/auth_client.py +0 -0
  156. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/client_creator.py +0 -0
  157. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/config.py +0 -0
  158. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/config_dev.py +0 -0
  159. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/cycode_client.py +0 -0
  160. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/cycode_client_base.py +0 -0
  161. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/cycode_dev_based_client.py +0 -0
  162. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/cycode_token_based_client.py +0 -0
  163. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/headers.py +0 -0
  164. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/logger.py +0 -0
  165. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/report_client.py +0 -0
  166. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/cyclient/scan_config_base.py +0 -0
  167. {cycode-3.5.2.dev1 → cycode-3.5.3.dev1}/cycode/logger.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cycode
3
- Version: 3.5.2.dev1
3
+ Version: 3.5.3.dev1
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
@@ -0,0 +1 @@
1
+ __version__ = '3.5.3.dev1' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
@@ -12,6 +12,7 @@ from cycode.cli.files_collector.sca.sca_file_collector import add_sca_dependenci
12
12
  from cycode.cli.files_collector.zip_documents import zip_documents
13
13
  from cycode.cli.utils.get_api_client import get_report_cycode_client
14
14
  from cycode.cli.utils.progress_bar import SbomReportProgressBarSection
15
+ from cycode.cli.utils.scan_utils import is_cycodeignore_allowed_by_scan_config
15
16
  from cycode.cli.utils.sentry import add_breadcrumb
16
17
 
17
18
 
@@ -37,7 +38,11 @@ def path_command(
37
38
 
38
39
  try:
39
40
  documents = get_relevant_documents(
40
- progress_bar, SbomReportProgressBarSection.PREPARE_LOCAL_FILES, consts.SCA_SCAN_TYPE, (str(path),)
41
+ progress_bar,
42
+ SbomReportProgressBarSection.PREPARE_LOCAL_FILES,
43
+ consts.SCA_SCAN_TYPE,
44
+ (str(path),),
45
+ is_cycodeignore_allowed=is_cycodeignore_allowed_by_scan_config(ctx),
41
46
  )
42
47
  # TODO(MarshalX): combine perform_pre_scan_documents_actions with get_relevant_document.
43
48
  # unhardcode usage of context in perform_pre_scan_documents_actions
@@ -23,7 +23,11 @@ from cycode.cli.files_collector.zip_documents import zip_documents
23
23
  from cycode.cli.models import CliError, Document, LocalScanResult
24
24
  from cycode.cli.utils.progress_bar import ScanProgressBarSection
25
25
  from cycode.cli.utils.scan_batch import run_parallel_batched_scan
26
- from cycode.cli.utils.scan_utils import generate_unique_scan_id, set_issue_detected_by_scan_results
26
+ from cycode.cli.utils.scan_utils import (
27
+ generate_unique_scan_id,
28
+ is_cycodeignore_allowed_by_scan_config,
29
+ set_issue_detected_by_scan_results,
30
+ )
27
31
  from cycode.cyclient.models import ZippedFileScanResult
28
32
  from cycode.logger import get_logger
29
33
 
@@ -42,7 +46,13 @@ def scan_disk_files(ctx: typer.Context, paths: tuple[str, ...]) -> None:
42
46
  progress_bar = ctx.obj['progress_bar']
43
47
 
44
48
  try:
45
- documents = get_relevant_documents(progress_bar, ScanProgressBarSection.PREPARE_LOCAL_FILES, scan_type, paths)
49
+ documents = get_relevant_documents(
50
+ progress_bar,
51
+ ScanProgressBarSection.PREPARE_LOCAL_FILES,
52
+ scan_type,
53
+ paths,
54
+ is_cycodeignore_allowed=is_cycodeignore_allowed_by_scan_config(ctx),
55
+ )
46
56
  add_sca_dependencies_tree_documents_if_needed(ctx, scan_type, documents)
47
57
  scan_documents(ctx, documents, get_scan_parameters(ctx, paths))
48
58
  except Exception as e:
@@ -29,6 +29,7 @@ from cycode.cli.files_collector.commit_range_documents import (
29
29
  parse_commit_range_sast,
30
30
  parse_commit_range_sca,
31
31
  )
32
+ from cycode.cli.files_collector.documents_walk_ignore import filter_documents_with_cycodeignore
32
33
  from cycode.cli.files_collector.file_excluder import excluder
33
34
  from cycode.cli.files_collector.models.in_memory_zip import InMemoryZip
34
35
  from cycode.cli.files_collector.sca.sca_file_collector import (
@@ -40,7 +41,11 @@ from cycode.cli.models import Document
40
41
  from cycode.cli.utils.git_proxy import git_proxy
41
42
  from cycode.cli.utils.path_utils import get_path_by_os
42
43
  from cycode.cli.utils.progress_bar import ScanProgressBarSection
43
- from cycode.cli.utils.scan_utils import generate_unique_scan_id, set_issue_detected_by_scan_results
44
+ from cycode.cli.utils.scan_utils import (
45
+ generate_unique_scan_id,
46
+ is_cycodeignore_allowed_by_scan_config,
47
+ set_issue_detected_by_scan_results,
48
+ )
44
49
  from cycode.cyclient.models import ZippedFileScanResult
45
50
  from cycode.logger import get_logger
46
51
 
@@ -189,6 +194,12 @@ def _scan_sca_commit_range(ctx: typer.Context, repo_path: str, commit_range: str
189
194
  from_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, from_commit_documents)
190
195
  to_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, to_commit_documents)
191
196
 
197
+ is_cycodeignore_allowed = is_cycodeignore_allowed_by_scan_config(ctx)
198
+ from_commit_documents = filter_documents_with_cycodeignore(
199
+ from_commit_documents, repo_path, is_cycodeignore_allowed
200
+ )
201
+ to_commit_documents = filter_documents_with_cycodeignore(to_commit_documents, repo_path, is_cycodeignore_allowed)
202
+
192
203
  perform_sca_pre_commit_range_scan_actions(
193
204
  repo_path, from_commit_documents, from_commit_rev, to_commit_documents, to_commit_rev
194
205
  )
@@ -204,6 +215,11 @@ def _scan_secret_commit_range(
204
215
  consts.SECRET_SCAN_TYPE, commit_diff_documents_to_scan
205
216
  )
206
217
 
218
+ is_cycodeignore_allowed = is_cycodeignore_allowed_by_scan_config(ctx)
219
+ diff_documents_to_scan = filter_documents_with_cycodeignore(
220
+ diff_documents_to_scan, repo_path, is_cycodeignore_allowed
221
+ )
222
+
207
223
  scan_documents(
208
224
  ctx, diff_documents_to_scan, get_scan_parameters(ctx, (repo_path,)), is_git_diff=True, is_commit_range=True
209
225
  )
@@ -221,9 +237,14 @@ def _scan_sast_commit_range(ctx: typer.Context, repo_path: str, commit_range: st
221
237
  to_commit_rev,
222
238
  reverse_diff=False,
223
239
  )
240
+
224
241
  commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, commit_documents)
225
242
  diff_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, diff_documents)
226
243
 
244
+ is_cycodeignore_allowed = is_cycodeignore_allowed_by_scan_config(ctx)
245
+ commit_documents = filter_documents_with_cycodeignore(commit_documents, repo_path, is_cycodeignore_allowed)
246
+ diff_documents = filter_documents_with_cycodeignore(diff_documents, repo_path, is_cycodeignore_allowed)
247
+
227
248
  _scan_commit_range_documents(ctx, commit_documents, diff_documents, scan_parameters=scan_parameters)
228
249
 
229
250
 
@@ -254,11 +275,18 @@ def _scan_sca_pre_commit(ctx: typer.Context, repo_path: str) -> None:
254
275
  progress_bar_section=ScanProgressBarSection.PREPARE_LOCAL_FILES,
255
276
  repo_path=repo_path,
256
277
  )
278
+
257
279
  git_head_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, git_head_documents)
258
280
  pre_committed_documents = excluder.exclude_irrelevant_documents_to_scan(
259
281
  consts.SCA_SCAN_TYPE, pre_committed_documents
260
282
  )
261
283
 
284
+ is_cycodeignore_allowed = is_cycodeignore_allowed_by_scan_config(ctx)
285
+ git_head_documents = filter_documents_with_cycodeignore(git_head_documents, repo_path, is_cycodeignore_allowed)
286
+ pre_committed_documents = filter_documents_with_cycodeignore(
287
+ pre_committed_documents, repo_path, is_cycodeignore_allowed
288
+ )
289
+
262
290
  perform_sca_pre_hook_range_scan_actions(repo_path, git_head_documents, pre_committed_documents)
263
291
 
264
292
  _scan_commit_range_documents(
@@ -288,8 +316,12 @@ def _scan_secret_pre_commit(ctx: typer.Context, repo_path: str) -> None:
288
316
  is_git_diff_format=True,
289
317
  )
290
318
  )
319
+
291
320
  documents_to_scan = excluder.exclude_irrelevant_documents_to_scan(consts.SECRET_SCAN_TYPE, documents_to_scan)
292
321
 
322
+ is_cycodeignore_allowed = is_cycodeignore_allowed_by_scan_config(ctx)
323
+ documents_to_scan = filter_documents_with_cycodeignore(documents_to_scan, repo_path, is_cycodeignore_allowed)
324
+
293
325
  scan_documents(ctx, documents_to_scan, get_scan_parameters(ctx), is_git_diff=True)
294
326
 
295
327
 
@@ -301,11 +333,18 @@ def _scan_sast_pre_commit(ctx: typer.Context, repo_path: str, **_) -> None:
301
333
  progress_bar_section=ScanProgressBarSection.PREPARE_LOCAL_FILES,
302
334
  repo_path=repo_path,
303
335
  )
336
+
304
337
  pre_committed_documents = excluder.exclude_irrelevant_documents_to_scan(
305
338
  consts.SAST_SCAN_TYPE, pre_committed_documents
306
339
  )
307
340
  diff_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, diff_documents)
308
341
 
342
+ is_cycodeignore_allowed = is_cycodeignore_allowed_by_scan_config(ctx)
343
+ pre_committed_documents = filter_documents_with_cycodeignore(
344
+ pre_committed_documents, repo_path, is_cycodeignore_allowed
345
+ )
346
+ diff_documents = filter_documents_with_cycodeignore(diff_documents, repo_path, is_cycodeignore_allowed)
347
+
309
348
  _scan_commit_range_documents(ctx, pre_committed_documents, diff_documents, scan_parameters=scan_parameters)
310
349
 
311
350
 
@@ -8,6 +8,7 @@ from cycode.cli import consts
8
8
  from cycode.cli.apps.scan.code_scanner import scan_documents
9
9
  from cycode.cli.apps.scan.scan_parameters import get_scan_parameters
10
10
  from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception
11
+ from cycode.cli.files_collector.documents_walk_ignore import filter_documents_with_cycodeignore
11
12
  from cycode.cli.files_collector.file_excluder import excluder
12
13
  from cycode.cli.files_collector.repository_documents import get_git_repository_tree_file_entries
13
14
  from cycode.cli.files_collector.sca.sca_file_collector import add_sca_dependencies_tree_documents_if_needed
@@ -15,6 +16,7 @@ from cycode.cli.logger import logger
15
16
  from cycode.cli.models import Document
16
17
  from cycode.cli.utils.path_utils import get_path_by_os
17
18
  from cycode.cli.utils.progress_bar import ScanProgressBarSection
19
+ from cycode.cli.utils.scan_utils import is_cycodeignore_allowed_by_scan_config
18
20
  from cycode.cli.utils.sentry import add_breadcrumb
19
21
 
20
22
 
@@ -60,6 +62,9 @@ def repository_command(
60
62
 
61
63
  documents_to_scan = excluder.exclude_irrelevant_documents_to_scan(scan_type, documents_to_scan)
62
64
 
65
+ is_cycodeignore_allowed = is_cycodeignore_allowed_by_scan_config(ctx)
66
+ documents_to_scan = filter_documents_with_cycodeignore(documents_to_scan, str(path), is_cycodeignore_allowed)
67
+
63
68
  add_sca_dependencies_tree_documents_if_needed(ctx, scan_type, documents_to_scan)
64
69
 
65
70
  logger.debug('Found all relevant files for scanning %s', {'path': path, 'branch': branch})
@@ -1,9 +1,11 @@
1
+ import os
1
2
  from pathlib import Path
2
3
  from typing import Annotated, Optional
3
4
 
4
5
  import click
5
6
  import typer
6
7
 
8
+ from cycode.cli.apps.scan.remote_url_resolver import _try_get_git_remote_url
7
9
  from cycode.cli.cli_types import ExportTypeOption, ScanTypeOption, ScaScanTypeOption, SeverityOption
8
10
  from cycode.cli.consts import (
9
11
  ISSUE_DETECTED_STATUS_CODE,
@@ -161,10 +163,15 @@ def scan_command(
161
163
  scan_client = get_scan_cycode_client(ctx)
162
164
  ctx.obj['client'] = scan_client
163
165
 
164
- remote_scan_config = scan_client.get_scan_configuration_safe(scan_type)
166
+ # Get remote URL from current working directory
167
+ remote_url = _try_get_git_remote_url(os.getcwd())
168
+
169
+ remote_scan_config = scan_client.get_scan_configuration_safe(scan_type, remote_url)
165
170
  if remote_scan_config:
166
171
  excluder.apply_scan_config(str(scan_type), remote_scan_config)
167
172
 
173
+ ctx.obj['scan_config'] = remote_scan_config
174
+
168
175
  if export_type and export_file:
169
176
  console_printer = ctx.obj['console_printer']
170
177
  console_printer.enable_recording(export_type, export_file)
@@ -17,6 +17,8 @@ SAST_SCAN_TYPE = 'sast'
17
17
  IAC_SCAN_SUPPORTED_FILE_EXTENSIONS = ('.tf', '.tf.json', '.json', '.yaml', '.yml', '.dockerfile', '.containerfile')
18
18
  IAC_SCAN_SUPPORTED_FILE_PREFIXES = ('dockerfile', 'containerfile')
19
19
 
20
+ CYCODEIGNORE_FILENAME = '.cycodeignore'
21
+
20
22
  SECRET_SCAN_FILE_EXTENSIONS_TO_IGNORE = (
21
23
  '.DS_Store',
22
24
  '.bmp',
@@ -0,0 +1,124 @@
1
+ import os
2
+ from typing import TYPE_CHECKING
3
+
4
+ from cycode.cli import consts
5
+ from cycode.cli.logger import get_logger
6
+ from cycode.cli.utils.ignore_utils import IgnoreFilterManager
7
+
8
+ if TYPE_CHECKING:
9
+ from cycode.cli.models import Document
10
+
11
+ logger = get_logger('Documents Ignores')
12
+
13
+
14
+ def _get_cycodeignore_path(repo_path: str) -> str:
15
+ """Get the path to .cycodeignore file in the repository root."""
16
+ return os.path.join(repo_path, consts.CYCODEIGNORE_FILENAME)
17
+
18
+
19
+ def _create_ignore_filter_manager(repo_path: str, cycodeignore_path: str) -> IgnoreFilterManager:
20
+ """Create IgnoreFilterManager with .cycodeignore file."""
21
+ return IgnoreFilterManager.build(
22
+ path=repo_path,
23
+ global_ignore_file_paths=[cycodeignore_path],
24
+ global_patterns=[],
25
+ )
26
+
27
+
28
+ def _log_ignored_files(repo_path: str, dirpath: str, ignored_dirnames: list[str], ignored_filenames: list[str]) -> None:
29
+ """Log ignored files for debugging (similar to walk_ignore function)."""
30
+ rel_dirpath = '' if dirpath == repo_path else os.path.relpath(dirpath, repo_path)
31
+ display_dir = rel_dirpath or '.'
32
+
33
+ for is_dir, names in (
34
+ (True, ignored_dirnames),
35
+ (False, ignored_filenames),
36
+ ):
37
+ for name in names:
38
+ full_path = os.path.join(repo_path, display_dir, name)
39
+ if is_dir:
40
+ full_path = os.path.join(full_path, '*')
41
+ logger.debug('Ignoring match %s', full_path)
42
+
43
+
44
+ def _build_allowed_paths_set(ignore_filter_manager: IgnoreFilterManager, repo_path: str) -> set[str]:
45
+ """Build set of allowed file paths using walk_with_ignored."""
46
+ allowed_paths = set()
47
+
48
+ for dirpath, _dirnames, filenames, ignored_dirnames, ignored_filenames in ignore_filter_manager.walk_with_ignored():
49
+ _log_ignored_files(repo_path, dirpath, ignored_dirnames, ignored_filenames)
50
+
51
+ for filename in filenames:
52
+ file_path = os.path.join(dirpath, filename)
53
+ allowed_paths.add(file_path)
54
+
55
+ return allowed_paths
56
+
57
+
58
+ def _get_document_check_path(document: 'Document', repo_path: str) -> str:
59
+ """Get the normalized absolute path for a document to check against allowed paths."""
60
+ check_path = document.absolute_path
61
+ if not check_path:
62
+ check_path = document.path if os.path.isabs(document.path) else os.path.join(repo_path, document.path)
63
+
64
+ return os.path.normpath(check_path)
65
+
66
+
67
+ def _filter_documents_by_allowed_paths(
68
+ documents: list['Document'], allowed_paths: set[str], repo_path: str
69
+ ) -> list['Document']:
70
+ """Filter documents by checking if their paths are in the allowed set."""
71
+ filtered_documents = []
72
+
73
+ for document in documents:
74
+ try:
75
+ check_path = _get_document_check_path(document, repo_path)
76
+
77
+ if check_path in allowed_paths:
78
+ filtered_documents.append(document)
79
+ else:
80
+ relative_path = os.path.relpath(check_path, repo_path)
81
+ logger.debug('Filtered out document due to .cycodeignore: %s', relative_path)
82
+ except Exception as e:
83
+ logger.debug('Error processing document %s: %s', document.path, e)
84
+ filtered_documents.append(document)
85
+
86
+ return filtered_documents
87
+
88
+
89
+ def filter_documents_with_cycodeignore(
90
+ documents: list['Document'], repo_path: str, is_cycodeignore_allowed: bool = True
91
+ ) -> list['Document']:
92
+ """Filter documents based on .cycodeignore patterns.
93
+
94
+ This function uses .cycodeignore file in the repository root to filter out
95
+ documents whose paths match any of those patterns.
96
+
97
+ Args:
98
+ documents: List of Document objects to filter
99
+ repo_path: Path to the repository root
100
+ is_cycodeignore_allowed: Whether .cycodeignore filtering is allowed by scan configuration
101
+
102
+ Returns:
103
+ List of Document objects that don't match any .cycodeignore patterns
104
+ """
105
+ if not is_cycodeignore_allowed:
106
+ logger.debug('.cycodeignore filtering is not allowed by scan configuration')
107
+ return documents
108
+
109
+ cycodeignore_path = _get_cycodeignore_path(repo_path)
110
+
111
+ if not os.path.exists(cycodeignore_path):
112
+ logger.debug('.cycodeignore file does not exist in the repository root')
113
+ return documents
114
+
115
+ logger.info('Using %s for filtering documents', cycodeignore_path)
116
+
117
+ ignore_filter_manager = _create_ignore_filter_manager(repo_path, cycodeignore_path)
118
+
119
+ allowed_paths = _build_allowed_paths_set(ignore_filter_manager, repo_path)
120
+
121
+ filtered_documents = _filter_documents_by_allowed_paths(documents, allowed_paths, repo_path)
122
+
123
+ logger.debug('Filtered %d documents using .cycodeignore patterns', len(documents) - len(filtered_documents))
124
+ return filtered_documents
@@ -1,4 +1,5 @@
1
1
  import os
2
+ from collections.abc import Generator
2
3
  from typing import TYPE_CHECKING
3
4
 
4
5
  from cycode.cli.files_collector.file_excluder import excluder
@@ -17,10 +18,18 @@ if TYPE_CHECKING:
17
18
  from cycode.cli.utils.progress_bar import BaseProgressBar, ProgressBarSection
18
19
 
19
20
 
20
- def _get_all_existing_files_in_directory(path: str, *, walk_with_ignore_patterns: bool = True) -> list[str]:
21
+ def _get_all_existing_files_in_directory(
22
+ path: str, *, walk_with_ignore_patterns: bool = True, is_cycodeignore_allowed: bool = True
23
+ ) -> list[str]:
21
24
  files: list[str] = []
22
25
 
23
- walk_func = walk_ignore if walk_with_ignore_patterns else os.walk
26
+ if walk_with_ignore_patterns:
27
+
28
+ def walk_func(path: str) -> Generator[tuple[str, list[str], list[str]], None, None]:
29
+ return walk_ignore(path, is_cycodeignore_allowed=is_cycodeignore_allowed)
30
+ else:
31
+ walk_func = os.walk
32
+
24
33
  for root, _, filenames in walk_func(path):
25
34
  for filename in filenames:
26
35
  files.append(os.path.join(root, filename))
@@ -28,7 +37,7 @@ def _get_all_existing_files_in_directory(path: str, *, walk_with_ignore_patterns
28
37
  return files
29
38
 
30
39
 
31
- def _get_relevant_files_in_path(path: str) -> list[str]:
40
+ def _get_relevant_files_in_path(path: str, *, is_cycodeignore_allowed: bool = True) -> list[str]:
32
41
  absolute_path = get_absolute_path(path)
33
42
 
34
43
  if not os.path.isfile(absolute_path) and not os.path.isdir(absolute_path):
@@ -37,16 +46,21 @@ def _get_relevant_files_in_path(path: str) -> list[str]:
37
46
  if os.path.isfile(absolute_path):
38
47
  return [absolute_path]
39
48
 
40
- file_paths = _get_all_existing_files_in_directory(absolute_path)
49
+ file_paths = _get_all_existing_files_in_directory(absolute_path, is_cycodeignore_allowed=is_cycodeignore_allowed)
41
50
  return [file_path for file_path in file_paths if os.path.isfile(file_path)]
42
51
 
43
52
 
44
53
  def _get_relevant_files(
45
- progress_bar: 'BaseProgressBar', progress_bar_section: 'ProgressBarSection', scan_type: str, paths: tuple[str, ...]
54
+ progress_bar: 'BaseProgressBar',
55
+ progress_bar_section: 'ProgressBarSection',
56
+ scan_type: str,
57
+ paths: tuple[str, ...],
58
+ *,
59
+ is_cycodeignore_allowed: bool = True,
46
60
  ) -> list[str]:
47
61
  all_files_to_scan = []
48
62
  for path in paths:
49
- all_files_to_scan.extend(_get_relevant_files_in_path(path))
63
+ all_files_to_scan.extend(_get_relevant_files_in_path(path, is_cycodeignore_allowed=is_cycodeignore_allowed))
50
64
 
51
65
  # we are double the progress bar section length because we are going to process the files twice
52
66
  # first time to get the file list with respect of excluded patterns (excluding takes seconds to execute)
@@ -94,8 +108,11 @@ def get_relevant_documents(
94
108
  paths: tuple[str, ...],
95
109
  *,
96
110
  is_git_diff: bool = False,
111
+ is_cycodeignore_allowed: bool = True,
97
112
  ) -> list[Document]:
98
- relevant_files = _get_relevant_files(progress_bar, progress_bar_section, scan_type, paths)
113
+ relevant_files = _get_relevant_files(
114
+ progress_bar, progress_bar_section, scan_type, paths, is_cycodeignore_allowed=is_cycodeignore_allowed
115
+ )
99
116
 
100
117
  documents: list[Document] = []
101
118
  for file in relevant_files:
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  from collections.abc import Generator, Iterable
3
3
 
4
+ from cycode.cli import consts
4
5
  from cycode.cli.logger import get_logger
5
6
  from cycode.cli.utils.ignore_utils import IgnoreFilterManager
6
7
 
@@ -8,7 +9,6 @@ logger = get_logger('Ignores')
8
9
 
9
10
  _SUPPORTED_IGNORE_PATTERN_FILES = {
10
11
  '.gitignore',
11
- '.cycodeignore',
12
12
  }
13
13
  _DEFAULT_GLOBAL_IGNORE_PATTERNS = [
14
14
  '.git',
@@ -25,11 +25,17 @@ def _walk_to_top(path: str) -> Iterable[str]:
25
25
  yield path # Include the top-level directory
26
26
 
27
27
 
28
- def _collect_top_level_ignore_files(path: str) -> list[str]:
28
+ def _collect_top_level_ignore_files(path: str, *, is_cycodeignore_allowed: bool = True) -> list[str]:
29
29
  ignore_files = []
30
30
  top_paths = reversed(list(_walk_to_top(path))) # we must reverse it to make top levels more prioritized
31
+
32
+ supported_files = set(_SUPPORTED_IGNORE_PATTERN_FILES)
33
+ if is_cycodeignore_allowed:
34
+ supported_files.add(consts.CYCODEIGNORE_FILENAME)
35
+ logger.debug('.cycodeignore files included due to scan configuration')
36
+
31
37
  for dir_path in top_paths:
32
- for ignore_file in _SUPPORTED_IGNORE_PATTERN_FILES:
38
+ for ignore_file in supported_files:
33
39
  ignore_file_path = os.path.join(dir_path, ignore_file)
34
40
  if os.path.exists(ignore_file_path):
35
41
  logger.debug('Reading top level ignore file: %s', ignore_file_path)
@@ -37,10 +43,13 @@ def _collect_top_level_ignore_files(path: str) -> list[str]:
37
43
  return ignore_files
38
44
 
39
45
 
40
- def walk_ignore(path: str) -> Generator[tuple[str, list[str], list[str]], None, None]:
46
+ def walk_ignore(
47
+ path: str, *, is_cycodeignore_allowed: bool = True
48
+ ) -> Generator[tuple[str, list[str], list[str]], None, None]:
49
+ ignore_file_paths = _collect_top_level_ignore_files(path, is_cycodeignore_allowed=is_cycodeignore_allowed)
41
50
  ignore_filter_manager = IgnoreFilterManager.build(
42
51
  path=path,
43
- global_ignore_file_paths=_collect_top_level_ignore_files(path),
52
+ global_ignore_file_paths=ignore_file_paths,
44
53
  global_patterns=_DEFAULT_GLOBAL_IGNORE_PATTERNS,
45
54
  )
46
55
  for dirpath, dirnames, filenames, ignored_dirnames, ignored_filenames in ignore_filter_manager.walk_with_ignored():
@@ -1,11 +1,12 @@
1
1
  import os
2
- from typing import TYPE_CHECKING
2
+ from typing import TYPE_CHECKING, Optional
3
3
  from uuid import UUID, uuid4
4
4
 
5
5
  import typer
6
6
 
7
7
  if TYPE_CHECKING:
8
8
  from cycode.cli.models import LocalScanResult
9
+ from cycode.cyclient.models import ScanConfiguration
9
10
 
10
11
 
11
12
  def set_issue_detected(ctx: typer.Context, issue_detected: bool) -> None:
@@ -22,6 +23,11 @@ def is_scan_failed(ctx: typer.Context) -> bool:
22
23
  return did_fail or issue_detected
23
24
 
24
25
 
26
+ def is_cycodeignore_allowed_by_scan_config(ctx: typer.Context) -> bool:
27
+ scan_config: Optional[ScanConfiguration] = ctx.obj.get('scan_config')
28
+ return scan_config.is_cycode_ignore_allowed if scan_config else True
29
+
30
+
25
31
  def generate_unique_scan_id() -> UUID:
26
32
  if 'PYTEST_TEST_UNIQUE_ID' in os.environ:
27
33
  return UUID(os.environ['PYTEST_TEST_UNIQUE_ID'])
@@ -505,6 +505,7 @@ class SupportedModulesPreferencesSchema(Schema):
505
505
  @dataclass
506
506
  class ScanConfiguration:
507
507
  scannable_extensions: list[str]
508
+ is_cycode_ignore_allowed: bool
508
509
 
509
510
 
510
511
  class ScanConfigurationSchema(Schema):
@@ -512,6 +513,7 @@ class ScanConfigurationSchema(Schema):
512
513
  unknown = EXCLUDE
513
514
 
514
515
  scannable_extensions = fields.List(fields.String(), allow_none=True)
516
+ is_cycode_ignore_allowed = fields.Boolean(load_default=True)
515
517
 
516
518
  @post_load
517
519
  def build_dto(self, data: dict[str, Any], **_) -> 'ScanConfiguration':
@@ -280,16 +280,23 @@ class ScanClient:
280
280
  correct_scan_type = self.scan_config.get_async_scan_type(scan_type)
281
281
  return f'{self.get_scan_service_url_path(scan_type)}/{correct_scan_type}/configuration'
282
282
 
283
- def get_scan_configuration(self, scan_type: str) -> models.ScanConfiguration:
283
+ def get_scan_configuration(self, scan_type: str, remote_url: Optional[str] = None) -> models.ScanConfiguration:
284
+ params = {}
285
+ if remote_url:
286
+ params['remote_url'] = remote_url
287
+
284
288
  response = self.scan_cycode_client.get(
285
289
  url_path=self.get_scan_configuration_path(scan_type),
290
+ params=params,
286
291
  hide_response_content_log=self._hide_response_log,
287
292
  )
288
293
  return models.ScanConfigurationSchema().load(response.json())
289
294
 
290
- def get_scan_configuration_safe(self, scan_type: str) -> Optional['models.ScanConfiguration']:
295
+ def get_scan_configuration_safe(
296
+ self, scan_type: str, remote_url: Optional[str] = None
297
+ ) -> Optional['models.ScanConfiguration']:
291
298
  try:
292
- return self.get_scan_configuration(scan_type)
299
+ return self.get_scan_configuration(scan_type, remote_url)
293
300
  except RequestHttpError as e:
294
301
  if e.status_code == 404:
295
302
  logger.debug(
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "cycode"
3
- version = "3.5.2.dev1" # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
3
+ version = "3.5.3.dev1" # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
4
4
  description = "Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning."
5
5
  keywords=["secret-scan", "cycode", "devops", "token", "secret", "security", "cycode", "code"]
6
6
  authors = ["Cycode <support@cycode.com>"]
@@ -1 +0,0 @@
1
- __version__ = '3.5.2.dev1' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
File without changes
File without changes