codeaudit 1.8.0__tar.gz → 1.8.1__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 (267) hide show
  1. {codeaudit-1.8.0 → codeaudit-1.8.1}/CHANGELOG.md +16 -0
  2. {codeaudit-1.8.0 → codeaudit-1.8.1}/PKG-INFO +2 -2
  3. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/codeauditcommands.md +1 -1
  4. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_basic.ipynb +1 -1
  5. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/codeauditchecks.html +1 -1
  6. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/demoscan.json +2 -2
  7. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/installation.md +5 -1
  8. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/intro.md +17 -0
  9. {codeaudit-1.8.0 → codeaudit-1.8.1}/pyproject.toml +2 -2
  10. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/__about__.py +1 -1
  11. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/api_helpers.py +7 -1
  12. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/api_interfaces.py +93 -3
  13. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/checkmodules.py +30 -2
  14. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/dashboard_reports.py +7 -3
  15. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/data/secretslist.txt +2 -0
  16. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/dashboardapp.py +7 -1
  17. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp.html +9 -9
  18. codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp.html +295 -0
  19. codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp_171.js +91 -0
  20. codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp_180.html +295 -0
  21. codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp_180.js +91 -0
  22. codeaudit-1.8.1/tests/unit_tests/test_clean_import_list.py +58 -0
  23. codeaudit-1.8.0/src/dashboard/pyodide/deployed/dashboardapp.js +0 -91
  24. codeaudit-1.8.0/src/dashboard/pyodide/deployed/dashboardapp_version166.html +0 -295
  25. codeaudit-1.8.0/src/dashboard/pyodide/deployed/dashboardapp_version166.js +0 -91
  26. {codeaudit-1.8.0 → codeaudit-1.8.1}/.github/workflows/python-test.yml +0 -0
  27. {codeaudit-1.8.0 → codeaudit-1.8.1}/.gitignore +0 -0
  28. {codeaudit-1.8.0 → codeaudit-1.8.1}/CONTRIBUTE.md +0 -0
  29. {codeaudit-1.8.0 → codeaudit-1.8.1}/LICENSE.txt +0 -0
  30. {codeaudit-1.8.0 → codeaudit-1.8.1}/README.md +0 -0
  31. {codeaudit-1.8.0 → codeaudit-1.8.1}/SECURITY.md +0 -0
  32. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/.gitignore +0 -0
  33. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/class_index.html +0 -0
  34. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/coverage_html_cb_dd2e7eb5.js +0 -0
  35. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/favicon_32_cb_c827f16f.png +0 -0
  36. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/function_index.html +0 -0
  37. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/index.html +0 -0
  38. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/keybd_closed_cb_900cfef5.png +0 -0
  39. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/status.json +0 -0
  40. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/style_cb_9ff733b0.css +0 -0
  41. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8___about___py.html +0 -0
  42. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8___init___py.html +0 -0
  43. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_altairplots_py.html +0 -0
  44. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_api_helpers_py.html +0 -0
  45. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_api_interfaces_py.html +0 -0
  46. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_api_reporting_py.html +0 -0
  47. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_checkmodules_py.html +0 -0
  48. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_codeaudit_dashboard_py.html +0 -0
  49. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_codeaudit_py.html +0 -0
  50. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_complexitycheck_py.html +0 -0
  51. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_dashboard_reports_py.html +0 -0
  52. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_filehelpfunctions_py.html +0 -0
  53. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_htmlhelpfunctions_py.html +0 -0
  54. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_issuevalidations_py.html +0 -0
  55. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_privacy_lint_py.html +0 -0
  56. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_pypi_package_scan_py.html +0 -0
  57. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_reporting_py.html +0 -0
  58. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_security_checks_py.html +0 -0
  59. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_suppression_py.html +0 -0
  60. {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_totals_py.html +0 -0
  61. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/CLIcommands.ipynb +0 -0
  62. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/CONTRIBUTE.md +0 -0
  63. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/_config.yml +0 -0
  64. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/_static/nocxstyle.css +0 -0
  65. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/_toc.yml +0 -0
  66. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/about.md +0 -0
  67. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/apidocs/api_intro.md +0 -0
  68. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/apidocs/codeaudit.rst +0 -0
  69. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/apidocs/modules.rst +0 -0
  70. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/architecture.md +0 -0
  71. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/changelog.md +0 -0
  72. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/assert_check.md +0 -0
  73. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/base64_check.md +0 -0
  74. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/binding_check.md +0 -0
  75. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/builtinfunctions_check.md +0 -0
  76. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/chmod_check.md +0 -0
  77. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/directorycreation_check.md +0 -0
  78. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/dynamicimport_check.md +0 -0
  79. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/exception_check.md +0 -0
  80. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/ftp_check.md +0 -0
  81. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/hash_check.md +0 -0
  82. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/httpserver_check.md +0 -0
  83. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/input_check.md +0 -0
  84. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/loggingconf_check.md +0 -0
  85. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/marshal_check.md +0 -0
  86. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/mktemp_check.md +0 -0
  87. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/multiprocessing_check.md +0 -0
  88. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/pickle_check.md +0 -0
  89. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/random_check.md +0 -0
  90. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/shelve_check.md +0 -0
  91. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/shutil_check.md +0 -0
  92. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/subprocess_check.md +0 -0
  93. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/syscalls_check.md +0 -0
  94. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/systemcalls_check.md +0 -0
  95. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/tarfile_extract_check.md +0 -0
  96. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/xml_check.md +0 -0
  97. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/zipfile_check.md +0 -0
  98. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checksinformation.md +0 -0
  99. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/cimode.md +0 -0
  100. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/codeauditchecks.md +0 -0
  101. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/codeauditoverview.md +0 -0
  102. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/complexitycheck.md +0 -0
  103. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/data_egress_implementation.md +0 -0
  104. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/data_exfiltration_detection.md +0 -0
  105. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_checks.ipynb +0 -0
  106. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_json.ipynb +0 -0
  107. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_overview.ipynb +0 -0
  108. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_scanning.ipynb +0 -0
  109. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_checks.ipynb +0 -0
  110. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/demofile.py +0 -0
  111. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/directoryscan.html +0 -0
  112. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/example_risk_heatmap.ipynb +0 -0
  113. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/example_weakness_perfile_view.ipynb +0 -0
  114. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/filescan.html +0 -0
  115. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/modulescan.html +0 -0
  116. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/overview.html +0 -0
  117. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/features.md +0 -0
  118. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/filescan.md +0 -0
  119. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/filescan.png +0 -0
  120. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/handling_errors.md +0 -0
  121. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/help.md +0 -0
  122. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/howtoscan.md +0 -0
  123. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/OO.png +0 -0
  124. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/ROI_logo.png +0 -0
  125. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/YourLogoHere.png +0 -0
  126. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/ai_use.png +0 -0
  127. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/architecture_overview.png +0 -0
  128. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/codeauditlogo.png +0 -0
  129. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/filescan_screenshot_16012026.png +0 -0
  130. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/modulescan_screenshot_16012026.png +0 -0
  131. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/nocxbanner.png +0 -0
  132. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/overview_linkaudit.png +0 -0
  133. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/overview_screenshot_16012026.png +0 -0
  134. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/implementedvalidations.md +0 -0
  135. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/issues.md +0 -0
  136. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/license.md +0 -0
  137. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/makeitbetter.md +0 -0
  138. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/markingissues.md +0 -0
  139. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/modulescan.md +0 -0
  140. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/overviewplot.png +0 -0
  141. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/pca_overview.png +0 -0
  142. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/project_philosophy.md +0 -0
  143. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/sponsors.md +0 -0
  144. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/userguide.md +0 -0
  145. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/warnings.md +0 -0
  146. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/whatissast.md +0 -0
  147. {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/whysast.md +0 -0
  148. {codeaudit-1.8.0 → codeaudit-1.8.1}/filescan.png +0 -0
  149. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/__init__.py +0 -0
  150. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/altairplots.py +0 -0
  151. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/api_reporting.py +0 -0
  152. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/ci_workflowscan.py +0 -0
  153. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/complexitycheck.py +0 -0
  154. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/corecli.py +0 -0
  155. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/data/sastchecks.csv +0 -0
  156. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/filehelpfunctions.py +0 -0
  157. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/htmlhelpfunctions.py +0 -0
  158. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/issuevalidations.py +0 -0
  159. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/privacy_lint.py +0 -0
  160. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/pypi_package_scan.py +0 -0
  161. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/reporting.py +0 -0
  162. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/security_checks.py +0 -0
  163. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/simple.css +0 -0
  164. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/suppression.py +0 -0
  165. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/totals.py +0 -0
  166. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/__init__.py +0 -0
  167. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/module_load_validation.html +0 -0
  168. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/module_load_validation2.html +0 -0
  169. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp.js +0 -0
  170. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp_171.html +0 -0
  171. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp_171.js +0 -0
  172. {codeaudit-1.8.0/src/dashboard/pyodide/deployed → codeaudit-1.8.1/src/dashboard/pyodide}/dashboardapp_version162.html +0 -0
  173. {codeaudit-1.8.0/src/dashboard/pyodide/deployed → codeaudit-1.8.1/src/dashboard/pyodide}/dashboardapp_version162.js +0 -0
  174. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp_version166.html +0 -0
  175. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp_version166.js +0 -0
  176. /codeaudit-1.8.0/src/dashboard/pyodide/deployed/dashboardapp_171.js → /codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp.js +0 -0
  177. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/deployed/dashboardapp_171.html +0 -0
  178. {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/requirements.txt +0 -0
  179. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/__init__.py +0 -0
  180. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/count_lines_file1.py +0 -0
  181. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/clean.py +0 -0
  182. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/elastic.py +0 -0
  183. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/example1.py +0 -0
  184. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/klyne.py +0 -0
  185. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/mixed.py +0 -0
  186. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/telemetry.py +0 -0
  187. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/telemetryfile2.py +0 -0
  188. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/suppression/sastsuppression_0.py +0 -0
  189. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/suppression/sastsuppression_1.py +0 -0
  190. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/suppression/sastsuppression_2.py +0 -0
  191. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_apicalls.py +0 -0
  192. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_apicalls2.py +0 -0
  193. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_base64.py +0 -0
  194. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_basicpatterns.py +0 -0
  195. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_chmod.py +0 -0
  196. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_constructspart2.py +0 -0
  197. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_correctexceptionuse.py +0 -0
  198. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_count_commentlines.py +0 -0
  199. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_directorycreation.py +0 -0
  200. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_directorycreation2.py +0 -0
  201. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_dynamic_import.py +0 -0
  202. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_edgecases.py +0 -0
  203. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_ftp.py +0 -0
  204. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_hashstrenght.py +0 -0
  205. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_importlib_util.py +0 -0
  206. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_modulecheck.py +0 -0
  207. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_obfuscatingbuiltins.py +0 -0
  208. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_oschecks.py +0 -0
  209. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_pylintreport.py +0 -0
  210. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_pypiscan.py +0 -0
  211. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_random.py +0 -0
  212. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_secretfinding.py +0 -0
  213. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_standardlibconstructs.py +0 -0
  214. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_subprocess.py +0 -0
  215. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_suppression.py +0 -0
  216. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_suppressionlogic.py +0 -0
  217. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_totalscheck.py +0 -0
  218. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_wasmsafe_funtions.py +0 -0
  219. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_zstd.py +0 -0
  220. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/__init__.py +0 -0
  221. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/test_collectsourcefiles.py +0 -0
  222. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/test_count_weaknesses.py +0 -0
  223. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/test_filehelpfunctions.py +0 -0
  224. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/test_readinsourcefile.py +0 -0
  225. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/allshit.py +0 -0
  226. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/apivalidations.py +0 -0
  227. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/assert.py +0 -0
  228. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/base64.py +0 -0
  229. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/chmod_things.py +0 -0
  230. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/codeaudit_scan.json +0 -0
  231. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/complexitycheck.py +0 -0
  232. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/correctcounts.py +0 -0
  233. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/danger_imports.py +0 -0
  234. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/directorycreation.py +0 -0
  235. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/directorycreation2.py +0 -0
  236. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/dunderexec_with_parsing_error.py +0 -0
  237. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/eval.py +0 -0
  238. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/eval2.py +0 -0
  239. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/exception.py +0 -0
  240. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/file3.py +0 -0
  241. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/file_with_warnings.py +0 -0
  242. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/ftp.py +0 -0
  243. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/gzip.py +0 -0
  244. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/hashcheck.py +0 -0
  245. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/httpserver.py +0 -0
  246. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/inputstatement.py +0 -0
  247. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/malware.py +0 -0
  248. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/malwareAI.py +0 -0
  249. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/marshal.py +0 -0
  250. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/modulecheck.py +0 -0
  251. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/multiprocessing.py +0 -0
  252. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/obfuscating.py +0 -0
  253. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/oschecks.py +0 -0
  254. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/pickle.py +0 -0
  255. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/python2_file_willnotwork.py +0 -0
  256. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/random.py +0 -0
  257. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/shelve.py +0 -0
  258. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/shutil.py +0 -0
  259. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/subprocess.py +0 -0
  260. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/syslibrary.py +0 -0
  261. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/tarfilevalidation.py +0 -0
  262. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/tempcheck.py +0 -0
  263. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/validation1.py +0 -0
  264. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/validation2.py +0 -0
  265. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/xml.py +0 -0
  266. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/zipfile.py +0 -0
  267. {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/zstd.py +0 -0
@@ -1,5 +1,21 @@
1
1
  # Change Log
2
2
 
3
+ ## Version 1.8.1:
4
+
5
+ **Added**
6
+ - Dashboard: Updated info text on Dashboard version.
7
+ - Updated secrets list for egress scanning.
8
+
9
+ **Changed**
10
+ - Reporting (WASM version): Updated imported modules display logic—submodules and private modules are now hidden so that only real imported external modules are shown.
11
+
12
+ **Fixed**
13
+ - Reporting (WASM version): Resolved an error in the imported modules.
14
+
15
+ **Documentation**
16
+ - Improved API documentation.
17
+ - Various minor improvements.
18
+
3
19
  ## Version 1.8.0:
4
20
 
5
21
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codeaudit
3
- Version: 1.8.0
3
+ Version: 1.8.1
4
4
  Summary: A modern Python security source code analyzer (SAST) based on distrust.
5
5
  Project-URL: Homepage, https://codeaudit.nocomplexity.com
6
6
  Project-URL: Documentation, https://github.com/nocomplexity/codeaudit#readme
@@ -10,7 +10,7 @@ Author-email: Maikel Mardjan <mike@bm-support.org>
10
10
  License-Expression: GPL-3.0-or-later
11
11
  License-File: LICENSE.txt
12
12
  Keywords: Complexity Checker,Python SAST,SAST,SAST API
13
- Classifier: Development Status :: 4 - Beta
13
+ Classifier: Development Status :: 5 - Production/Stable
14
14
  Classifier: Environment :: Console
15
15
  Classifier: Intended Audience :: Developers
16
16
  Classifier: Intended Audience :: Science/Research
@@ -1,6 +1,6 @@
1
1
  % THIS FILE IS GENERATED! - Use CLIcommands.ipynb to make it better!
2
2
  # Commands Overview
3
- Python Code Audit commands for: version: 1.8.0
3
+ Python Code Audit commands for: version: 1.8.1
4
4
  ```
5
5
  ----------------------------------------------------
6
6
  _ __ _
@@ -115,7 +115,7 @@
115
115
  "id": "98422d63-ec29-49b2-bb4c-3912288cb584",
116
116
  "metadata": {},
117
117
  "source": [
118
- "## Overview of vulnerability of a module\n",
118
+ "## Security Assessment of Module Vulnerabilities\n",
119
119
  "\n",
120
120
  "This API retrieves security vulnerability data for external modules via the [OSV (Open Source Vulnerability) Database](https://nocomplexity.com/documents/securityarchitecture/references/vulnerabilitydatabases.html#vulnerability-databases).\n",
121
121
  "\n",
@@ -774,4 +774,4 @@ footer {
774
774
  <td>Vulnerable to path traversal attacks if used with untrusted archives.</td>
775
775
  </tr>
776
776
  </tbody>
777
- </table><br><p>Number of implemented security validations:<b>89</b></p><p>Version of codeaudit: <b>1.8.0</b><p>Because Python and cybersecurity are constantly changing, issue reports <b>SHOULD</b> specify the codeaudit version used.</p><p><b>Disclaimer:</b> <i>This SAST tool <a href="https://github.com/nocomplexity/codeaudit" target="_blank"><b>Python Code Audit</b></a> provides a powerful, automatic security analysis for Python source code. However, it's not a substitute for human review in combination with business knowledge. Undetected vulnerabilities may still exist.</i></p><p>This Python security report was created on: <b>2026-07-10 14:05</b> with <a href="https://github.com/nocomplexity/codeaudit" target="_blank"><b>Python Code Audit</b></a> version <b>1.8.0</b></p><hr><footer><div class="footer-links">Check the <a href="https://nocomplexity.com/documents/codeaudit/intro.html" target="_blank">documentation</a> for help on found issues.<br>Codeaudit is made with <span class="heart">&#10084;</span> by cyber security professionals who advocate for <a href="https://nocomplexity.com/simplify-security/" target="_blank">open simple security solutions</a>.<br><a href="https://nocomplexity.com/documents/codeaudit/CONTRIBUTE.html" target="_blank">Join the community</a> and contribute to make this tool better!</div></footer></div></body></html>
777
+ </table><br><p>Number of implemented security validations:<b>89</b></p><p>Version of codeaudit: <b>1.8.1</b><p>Because Python and cybersecurity are constantly changing, issue reports <b>SHOULD</b> specify the codeaudit version used.</p><p><b>Disclaimer:</b> <i>This SAST tool <a href="https://github.com/nocomplexity/codeaudit" target="_blank"><b>Python Code Audit</b></a> provides a powerful, automatic security analysis for Python source code. However, it's not a substitute for human review in combination with business knowledge. Undetected vulnerabilities may still exist.</i></p><p>This Python security report was created on: <b>2026-07-31 13:23</b> with <a href="https://github.com/nocomplexity/codeaudit" target="_blank"><b>Python Code Audit</b></a> version <b>1.8.1</b></p><hr><footer><div class="footer-links">Check the <a href="https://nocomplexity.com/documents/codeaudit/intro.html" target="_blank">documentation</a> for help on found issues.<br>Codeaudit is made with <span class="heart">&#10084;</span> by cyber security professionals who advocate for <a href="https://nocomplexity.com/simplify-security/" target="_blank">open simple security solutions</a>.<br><a href="https://nocomplexity.com/documents/codeaudit/CONTRIBUTE.html" target="_blank">Join the community</a> and contribute to make this tool better!</div></footer></div></body></html>
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "Python_Code_Audit",
3
- "version": "1.8.0",
4
- "generated_on": "2026-07-10 14:05",
3
+ "version": "1.8.1",
4
+ "generated_on": "2026-07-31 13:23",
5
5
  "file_security_info": {
6
6
  "0": {
7
7
  "FileName": "demofile.py",
@@ -12,7 +12,11 @@ Launch web-based version
12
12
  ```
13
13
 
14
14
  :::{note}
15
- The browser-based version runs 100% locally; however, please note that not all functionality is available. You can perform a security scan on packages available from PyPI.
15
+ The browser-based version runs 100% locally in your browser.
16
+ No data is ever sent to a server. No analytics. No telemetry.
17
+
18
+ Please note that not all functionality is available. You can perform a security scan on packages available from PyPI.
19
+
16
20
  :::
17
21
 
18
22
  ## Install for full functionality
@@ -10,6 +10,23 @@
10
10
 
11
11
  **Python Code Audit** is a Static Application **Security** Testing (SAST) tool used to find **security weaknesses** in Python code.
12
12
 
13
+ ::::{grid}
14
+ :gutter: 3
15
+
16
+ :::{grid-item-card}
17
+ {octicon}`rocket;4em;caption-text` **Launch Web version**
18
+
19
+ Audit Python packages instantly. No install required. Perfect for scanning PyPI packages before you use them. Runs entirely in your browser. Zero data sent to servers. No analytics. No telemetry. Ever.
20
+
21
+ +++
22
+
23
+ ```{button-link} https://nocomplexity.com/codeauditapp/dashboardapp.html
24
+ :color: danger
25
+ :align: center
26
+ Launch
27
+ ```
28
+ :::
29
+ ::::
13
30
 
14
31
  ::::{grid} 2
15
32
  :class-container: text-center
@@ -19,8 +19,8 @@ classifiers = [
19
19
  "Intended Audience :: Developers",
20
20
  "Intended Audience :: Science/Research",
21
21
  "Topic :: Security",
22
- "Topic :: Software Development :: Quality Assurance",
23
- "Development Status :: 4 - Beta",
22
+ "Topic :: Software Development :: Quality Assurance",
23
+ "Development Status :: 5 - Production/Stable",
24
24
  "Programming Language :: Python",
25
25
  "Programming Language :: Python :: 3.11",
26
26
  "Programming Language :: Python :: 3.12",
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2025-present Maikel Mardjan
2
2
  #
3
3
  # SPDX-License-Identifier: GPL-3.0-or-later
4
- __version__ = "1.8.0"
4
+ __version__ = "1.8.1"
@@ -12,7 +12,12 @@ You should have received a copy of the GNU General Public License along with thi
12
12
  Function to create nice APIs. So API helper functions.
13
13
  """
14
14
 
15
- from codeaudit.api_interfaces import get_modules, get_overview, _build_weakness_details
15
+ from codeaudit.api_interfaces import (
16
+ get_modules,
17
+ get_overview,
18
+ _build_weakness_details,
19
+ package_imports,
20
+ )
16
21
  from codeaudit.checkmodules import get_all_modules
17
22
  from codeaudit.filehelpfunctions import (
18
23
  collect_python_source_files,
@@ -77,6 +82,7 @@ def _codeaudit_directory_scan_wasm(input_path, nosec_flag):
77
82
  "statistics_overview": package_overview,
78
83
  "module_overview": modules_discovered,
79
84
  }
85
+
80
86
  # File scanning
81
87
  for i, file in enumerate(files_to_check):
82
88
  try:
@@ -31,7 +31,10 @@ from codeaudit.checkmodules import (
31
31
  get_all_modules,
32
32
  get_imported_modules_by_file,
33
33
  get_standard_library_modules,
34
+ get_python_files_from_package,
34
35
  )
36
+
37
+
35
38
  from codeaudit.filehelpfunctions import (
36
39
  collect_python_source_files,
37
40
  get_filename_from_path,
@@ -152,6 +155,13 @@ def filescan(input_path, nosec=False):
152
155
  try:
153
156
  scan_output = _codeaudit_directory_scan(src_dir, nosec_flag=nosec)
154
157
  output |= scan_output
158
+ # Replace the value of "imported_modules" in the nested dict
159
+ correct_imported_modules = package_imports(output)
160
+ output["module_overview"]["imported_modules"] = correct_imported_modules
161
+ # correct statistics for modules count in a package
162
+ output["statistics_overview"]["External Modules"] = len(
163
+ correct_imported_modules
164
+ )
155
165
  finally:
156
166
  # Cleaning up temp directory
157
167
  tmp_handle.cleanup() # deletes everything from temp directory
@@ -310,12 +320,67 @@ def get_weakness_counts(input_file, nosec=False):
310
320
  return dict(counter)
311
321
 
312
322
 
323
+ def package_imports(scanresult):
324
+ """Return the external Python modules imported by a scanned package.
325
+
326
+ This function extracts the list of imported modules from a SAST scan and
327
+ filters out modules that belong to the package itself. If a package name is
328
+ available, the returned module names are further normalized by removing
329
+ imports that resolve to the package's own namespace.
330
+
331
+ Args:
332
+ scanresult (dict): Scan result containing package metadata. The
333
+ dictionary is expected to contain a ``module_overview`` mapping with
334
+ an ``imported_modules`` list. Optionally, it may include a
335
+ ``package_name`` key used for additional filtering.
336
+
337
+ Returns:
338
+ list[str] | None: A list of external module names imported by the
339
+ package. Returns ``None`` if ``scanresult`` is not a dictionary or if
340
+ the expected ``module_overview`` or ``imported_modules`` entries are
341
+ missing or have an invalid type.
342
+
343
+ Example:
344
+ scanresult = filescan("packagename") E.g.:
345
+
346
+ >> scanresult = filescan("codeaudit") # Current version, without SAST details
347
+
348
+ >> modules_discovered = scanresult["module_overview"]
349
+
350
+ >> imported_modules = modules_discovered["imported_modules"]
351
+
352
+ >> imported_modules
353
+ ['altair', 'fire', 'pandas', 'panel', 'pyodide.http']
354
+ """
355
+ if not isinstance(scanresult, dict):
356
+ return None
357
+
358
+ module_overview = scanresult.get("module_overview")
359
+ if not isinstance(module_overview, dict):
360
+ return None
361
+
362
+ imported_modules = module_overview.get("imported_modules")
363
+ if not isinstance(imported_modules, list):
364
+ return None
365
+
366
+ package_files = set(get_python_files_from_package(scanresult))
367
+ external_modules = [
368
+ module for module in imported_modules if module not in package_files
369
+ ]
370
+
371
+ package_name = scanresult.get("package_name")
372
+ if package_name:
373
+ external_modules = _clean_import_list(external_modules, package_name)
374
+
375
+ return external_modules
376
+
377
+
313
378
  def get_modules(filename):
314
- """Extract imported modules from a Python source file.
379
+ """Extract modules used in a Python source file.
315
380
 
316
381
  Analyzes the specified Python file and returns the modules imported
317
382
  directly within the source code. This approach relies on the actual
318
- imports present in the file rather than dependency declarations such as
383
+ imports **present** in the file rather than dependency declarations such as
319
384
  ``requirements.txt`` or ``pyproject.toml``, which may be incomplete or
320
385
  outdated.
321
386
 
@@ -325,7 +390,7 @@ def get_modules(filename):
325
390
  Returns:
326
391
  dict: A dictionary containing discovered modules. Expected keys are:
327
392
  - ``core_modules`` (list[str]): Standard library modules.
328
- - ``imported_modules`` (list[str]): Third-party modules.
393
+ - ``imported_modules`` (list[str]): Imported modules in the file and third-party modules.
329
394
  """
330
395
  modules_found = get_imported_modules_by_file(filename)
331
396
  return modules_found
@@ -756,3 +821,28 @@ def _collect_issue_lines(filename, line, context=1):
756
821
  )
757
822
 
758
823
  return code_lines
824
+
825
+
826
+ def _clean_import_list(modules, package):
827
+ """Return a cleaned list of importable module names.
828
+
829
+ Removes the specified package, all of its submodules, and any private
830
+ modules whose final name component begins with an underscore.
831
+
832
+ Args:
833
+ modules (Iterable[str]): Module names to filter.
834
+ package (str): Package name to exclude.
835
+
836
+ Returns:
837
+ list[str]: Filtered module names.
838
+ """
839
+ cleaned_list = [
840
+ module
841
+ for module in modules
842
+ if (
843
+ module != package
844
+ and not module.startswith(f"{package}.")
845
+ and not module.rsplit(".", 1)[-1].startswith("_")
846
+ )
847
+ ]
848
+ return cleaned_list
@@ -19,6 +19,7 @@ import sys
19
19
  import urllib.request
20
20
 
21
21
  from codeaudit.filehelpfunctions import collect_python_source_files, read_in_source_file
22
+ from pathlib import Path
22
23
 
23
24
 
24
25
  def get_imported_modules(source_code):
@@ -56,7 +57,16 @@ def get_imported_modules(source_code):
56
57
 
57
58
 
58
59
  def get_standard_library_modules():
59
- """works only Python 3.10+ or higher!"""
60
+ """Return the names of public Python standard library modules.
61
+
62
+ Requires Python 3.10 or later, where ``sys.stdlib_module_names`` is
63
+ available. Private modules (those whose names begin with ``"_"``) are
64
+ excluded from the result.
65
+
66
+ Returns:
67
+ list[str]: A sorted list of public standard library module names.
68
+ Returns an empty list if ``sys.stdlib_module_names`` is unavailable.
69
+ """
60
70
  names = []
61
71
  if hasattr(sys, "stdlib_module_names"):
62
72
  core_modules = sorted(list(sys.stdlib_module_names))
@@ -141,7 +151,7 @@ def get_all_modules(directory_to_scan):
141
151
 
142
152
 
143
153
  def get_imported_modules_by_file(python_file_name):
144
- "Function to get all modules of a single Python file - never trust requirements.txt or project.toml"
154
+ "Function to get all modules of a single(!) Python file - never trust requirements.txt or project.toml"
145
155
  source = read_in_source_file(python_file_name)
146
156
  used_modules = get_imported_modules(source)
147
157
  core_modules = used_modules["core_modules"]
@@ -151,3 +161,21 @@ def get_imported_modules_by_file(python_file_name):
151
161
  "imported_modules": sorted(external_modules),
152
162
  }
153
163
  return all_modules_discovered
164
+
165
+
166
+ def get_python_files_from_package(scanresult):
167
+ """Return a list of Python filenames (without .py) in a nested dict/list."""
168
+ filenames = []
169
+
170
+ if isinstance(scanresult, dict):
171
+ if "FileName" in scanresult:
172
+ filenames.append(Path(scanresult["FileName"]).stem)
173
+
174
+ for value in scanresult.values():
175
+ filenames.extend(get_python_files_from_package(value))
176
+
177
+ elif isinstance(scanresult, list):
178
+ for item in scanresult:
179
+ filenames.extend(get_python_files_from_package(item))
180
+
181
+ return filenames
@@ -15,6 +15,7 @@ API functions: Used for dashboard reporting (Panel / WASM) and notebooks, or to
15
15
  from codeaudit.__about__ import __version__
16
16
  from codeaudit.pypi_package_scan import get_latest_release_date, days_since_update
17
17
  from codeaudit.api_reporting import total_weaknesses
18
+ from codeaudit.api_interfaces import _clean_import_list, package_imports
18
19
 
19
20
  SAST_REPORT_CSS = """
20
21
  <style>
@@ -384,17 +385,19 @@ def report_used_modules(scanresult):
384
385
  return "<br><h2>⚠️ No scan result provided</h2>"
385
386
  modules_discovered = scanresult["module_overview"]
386
387
  core_modules = modules_discovered["core_modules"]
387
- external_modules = modules_discovered["imported_modules"]
388
+ # external_modules = modules_discovered["imported_modules"]
389
+ external_modules = package_imports(scanresult)
390
+ package_name = scanresult.get("package_name")
391
+ if package_name:
392
+ external_modules = _clean_import_list(external_modules, package_name)
388
393
  card1 += "<details>"
389
394
  card1 += "<summary><b>Used Python Standard libraries</b></summary>"
390
-
391
395
  card1 += (
392
396
  "<ul>\n"
393
397
  + "\n".join(f" <li>{module}</li>" for module in core_modules)
394
398
  + "\n</ul>"
395
399
  )
396
400
  card1 += "</details>"
397
-
398
401
  card2 = "<details>"
399
402
  card2 += "<summary><b>Imported libraries (modules)</b></summary>"
400
403
  card2 += (
@@ -442,6 +445,7 @@ def get_info_text():
442
445
  """
443
446
  <p><b>Python Code Audit</b> is a Static Application Security Testing (SAST) tool used to find security weaknesses in Python code.</p>
444
447
  <p>Use the CLI version for powerful command-line scanning with many more options.<p>
448
+ <p><i>This tool runs entirely in your browser. No data is ever sent to a server. No analytics. No telemetry. Ever.</i></p>
445
449
  <br><br>
446
450
  <a href="https://nocomplexity.com/documents/codeaudit/intro.html"
447
451
  target="_blank"
@@ -86,6 +86,7 @@ JWT_SIGNING_KEY
86
86
  JWT_TOKEN
87
87
  KEYFILE
88
88
  KUBE_TOKEN
89
+ LLM_API_KEY
89
90
  LYFENINJA_CLIENT_SECRET
90
91
  MASTER_KEY
91
92
  MISTRAL_API_KEY
@@ -119,6 +120,7 @@ SESSION_KEY
119
120
  SIGNING_KEY
120
121
  SILICONFLOW_API_KEY
121
122
  SLACK_TOKEN
123
+ SLACK_BOT_TOKEN
122
124
  SMTP_PASSWORD
123
125
  SSH_KEY
124
126
  static_key
@@ -43,7 +43,7 @@ from codeaudit.altairplots import (
43
43
  )
44
44
 
45
45
  from codeaudit.api_helpers import _codeaudit_directory_scan_wasm
46
- from codeaudit.api_interfaces import get_package_source, version
46
+ from codeaudit.api_interfaces import get_package_source, version, package_imports
47
47
 
48
48
  # --- Environment Detection ---
49
49
  IS_PYODIDE = "pyodide" in sys.modules
@@ -175,6 +175,12 @@ async def filescan_wasm(input_path, nosec=False):
175
175
  try:
176
176
  scan_output = _codeaudit_directory_scan_wasm(src_dir, nosec_flag=nosec)
177
177
  output |= scan_output
178
+ # correct statistics for imported modules and modules count
179
+ correct_imported_modules = package_imports(output)
180
+ output["module_overview"]["imported_modules"] = correct_imported_modules
181
+ output["statistics_overview"]["External Modules"] = len(
182
+ correct_imported_modules
183
+ )
178
184
  finally:
179
185
  if tmp_handle:
180
186
  tmp_handle.cleanup()
@@ -102,7 +102,7 @@
102
102
  </div>
103
103
  </section>
104
104
  <div class="pn-busy-container">
105
- <div id="b3bd5fe7-bbca-438b-b7d9-05fc35e95bc9" data-root-id="p1022" style="display: contents;"></div>
105
+ <div id="c1428a5c-5ce8-406f-a339-ecf99154f423" data-root-id="p1022" style="display: contents;"></div>
106
106
  </div>
107
107
  </div>
108
108
  </header>
@@ -110,14 +110,14 @@
110
110
  <aside class="mdc-drawer mdc-top-app-bar--fixed-adjust mdc-drawer--dismissible mdc-drawer--open" id="sidebar">
111
111
  <div class="mdc-drawer__content">
112
112
  <div class="mdc-list">
113
- <div id="e04b0cd0-6af2-4037-9fec-71defeb94848" data-root-id="p1037" style="display: contents;"></div>
113
+ <div id="d918edd0-838c-4f35-96b7-93e388d4fc8c" data-root-id="p1037" style="display: contents;"></div>
114
114
  </div>
115
115
  </div>
116
116
  </aside>
117
117
 
118
118
  <div class="mdc-drawer-app-content mdc-top-app-bar--fixed-adjust">
119
119
  <main class="main-content" id="main">
120
- <div id="a057f352-2c7d-4d41-bd74-b480f017f4fa" data-root-id="p1023" style="display: contents;"></div>
120
+ <div id="d2afc85a-cbd4-4aaa-92ad-6c9fc69fc719" data-root-id="p1023" style="display: contents;"></div>
121
121
  </main>
122
122
 
123
123
  <div id="pn-Modal" class="mdc-dialog">
@@ -148,10 +148,10 @@
148
148
  }
149
149
  </script>
150
150
 
151
- <div id="cb933ecc-cd4a-4704-a54d-63fee7cbf015" data-root-id="p1017" style="display: contents;"></div>
152
- <div id="af28ffa7-df41-4874-8c1d-9c3b08a038e6" data-root-id="p1019" style="display: contents;"></div>
153
- <div id="a4877837-e5a9-4774-b4d7-ad0dd7a4cf3d" data-root-id="p1011" style="display: contents;"></div>
154
- <div id="a0ba89f2-9c84-4fbd-bdff-b3111255f928" data-root-id="p1020" style="display: contents;"></div>
151
+ <div id="e9ccbf6a-6f30-42d1-80c6-ada3ae97aba4" data-root-id="p1017" style="display: contents;"></div>
152
+ <div id="c6a7efe4-ab93-47f6-bbe3-419006d99dc8" data-root-id="p1019" style="display: contents;"></div>
153
+ <div id="bb9b342b-3096-47e1-ac4a-16ca03b54925" data-root-id="p1011" style="display: contents;"></div>
154
+ <div id="aef73531-bc99-4369-b79b-503e6ae0186c" data-root-id="p1020" style="display: contents;"></div>
155
155
 
156
156
  </div>
157
157
 
@@ -255,7 +255,7 @@
255
255
  };
256
256
  </script>
257
257
  <script type="application/json" id="p1052">
258
- {"0d156486-1f3b-4c0e-8d22-590703d045a9":{"version":"3.8.2","title":"Python Security Code Audit","config":{"type":"object","name":"DocumentConfig","id":"p1009","attributes":{"reconnect_session":false,"notify_connection_status":false,"notifications":null}},"roots":[{"type":"object","name":"panel.models.location.Location","id":"p1011","attributes":{"name":"location","reload":false}},{"type":"object","name":"panel.models.markup.HTML","id":"p1017","attributes":{"name":"js_area","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1015","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1051","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/bundled/theme/material.css"}}],"width":0,"height":0,"margin":0,"sizing_mode":"fixed","align":"start","disable_math":true}},{"type":"object","name":"panel.models.reactive_html.ReactiveHTML","id":"p1019","attributes":{"name":"actions","subscribed_events":{"type":"set","entries":["dom_event"]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":0,"align":"start","data":{"type":"object","name":"MaterialTemplateActions1","id":"p1018","attributes":{"name":"MaterialTemplateActions00143","tags":["__ref:p1019"]}},"scripts":{"type":"map","entries":[["open_modal",["modal.open();\nsetTimeout(function() {{\n window.dispatchEvent(new Event(&amp;#x27;resize&amp;#x27;));\n}}, 200);"]],["close_modal",["modal.close()"]]]}}},{"type":"object","name":"panel.models.browser.BrowserInfo","id":"p1020","attributes":{"name":"browser_info"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1022","attributes":{"name":"busy_indicator","css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 20px; }","\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1021","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/loadingspinner.css"}},{"id":"p1051"}],"min_width":20,"min_height":20,"margin":[5,10],"align":"start"}},{"type":"object","name":"panel.models.layout.Column","id":"p1023","attributes":{"name":"main-123915234890192","tags":["main"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1016","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/listpanel.css"}},{"id":"p1051"}],"min_width":0,"min_height":0,"margin":0,"sizing_mode":"stretch_both","align":"start","children":[{"type":"object","name":"panel.models.tabs.Tabs","id":"p1024","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"min_width":0,"min_height":0,"margin":0,"sizing_mode":"stretch_both","align":"start","tabs":[{"type":"object","name":"TabPanel","id":"p1026","attributes":{"name":"HTML00123","title":"Package Overview","child":{"type":"object","name":"panel.models.markup.HTML","id":"p1025","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"\u26a0\ufe0f No scan result","disable_math":true}}}},{"type":"object","name":"TabPanel","id":"p1028","attributes":{"name":"HTML00123","title":"Used Modules","child":{"type":"object","name":"Spacer","id":"p1027","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1030","attributes":{"name":"HTML00123","title":"Complexity Insights","child":{"type":"object","name":"Spacer","id":"p1029","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1032","attributes":{"name":"HTML00123","title":"Weaknesses Overview","child":{"type":"object","name":"Spacer","id":"p1031","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1034","attributes":{"name":"HTML00123","title":"Weaknesses per file","child":{"type":"object","name":"Spacer","id":"p1033","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1036","attributes":{"name":"HTML00123","title":"Weaknesses Details","child":{"type":"object","name":"Spacer","id":"p1035","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}}]}}]}},{"type":"object","name":"panel.models.layout.Column","id":"p1037","attributes":{"name":"nav-123915235720704","tags":["nav"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1016"},{"id":"p1051"}],"min_width":300,"margin":0,"sizing_mode":"stretch_width","align":"start","children":[{"type":"object","name":"panel.models.markup.HTML","id":"p1039","attributes":{"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1038","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/markdown.css"}},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&amp;lt;h2 id=&amp;quot;package-code-security-scan&amp;quot;&amp;gt;Package Code Security Scan &amp;lt;a class=&amp;quot;header-anchor&amp;quot; href=&amp;quot;#package-code-security-scan&amp;quot;&amp;gt;\u00b6&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;\n"}},{"type":"object","name":"panel.models.widgets.TextInput","id":"p1040","attributes":{"subscribed_events":{"type":"set","entries":["enter-pressed"]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"width":300,"min_width":300,"margin":[5,10],"align":"start","title":"Python Package Name","placeholder":"Enter PyPI package (e.g., requests)...","max_length":5000}},{"type":"object","name":"panel.models.widgets.Button","id":"p1042","attributes":{"button_type":"primary","subscribed_events":{"type":"set","entries":["button_click"]},"css_classes":["solid"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1041","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/button.css"}},{"id":"p1051"}],"margin":[5,10],"align":"start","label":"Start Scan"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1043","attributes":{"css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 60px; }","\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1021"},{"id":"p1051"}],"min_width":60,"min_height":60,"margin":[5,10],"align":"start","text":"&amp;lt;span&amp;gt;&amp;lt;b&amp;gt;Scanning...&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1044","attributes":{"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1038"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&amp;lt;h3&amp;gt;Ready to scan.&amp;lt;/h3&amp;gt;\n"}},{"type":"object","name":"Spacer","id":"p1045","attributes":{"name":"Spacer00130","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"height":20,"min_height":20,"margin":0,"align":"start"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1046","attributes":{"styles":{"type":"map","entries":[["background","linear-gradient(135deg, #F0FDF4, #ECFDF5)"],["padding","18px"],["min-width","200px"],["font-size","15px"],["color","#1F2937"],["border","1px solid #D1FAE5"],["border-left","4px solid #10B981"],["border-radius","12px"],["box-shadow","0 2px 6px rgba(0, 0, 0, 0.05)"]]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"},"\n .bk-panel {\n background: transparent !important;\n }\n "],"min_width":0,"margin":[5,10],"sizing_mode":"stretch_width","align":"start","text":"\n &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Python Code Audit&amp;lt;/b&amp;gt; is a Static Application Security Testing (SAST) tool used to find security weaknesses in Python code.&amp;lt;/p&amp;gt;\n &amp;lt;p&amp;gt;Use the CLI version for powerful command-line scanning with many more options.&amp;lt;p&amp;gt;\n &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; \n &amp;lt;a href=&amp;quot;https://nocomplexity.com/documents/codeaudit/intro.html&amp;quot;\n target=&amp;quot;_blank&amp;quot;\n style=&amp;quot;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background-color: #24292f;\n color: white;\n text-decoration: none;\n border-radius: 8px;\n font-weight: 600;\n font-size: 15px;\n transition: all 0.2s ease;\n width: 200px;\n &amp;quot;&amp;gt;Documentation\n &amp;lt;/a&amp;gt;\n &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;\n &amp;lt;a href=&amp;quot;https://github.com/nocomplexity/codeaudit&amp;quot;\n target=&amp;quot;_blank&amp;quot;\n style=&amp;quot;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background-color: #24292f;\n color: white;\n text-decoration: none;\n border-radius: 8px;\n font-weight: 600;\n font-size: 15px;\n transition: all 0.2s ease;\n width: 200px;\n &amp;quot;&amp;gt;\n &amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;20&amp;quot; height=&amp;quot;20&amp;quot; fill=&amp;quot;currentColor&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot;&amp;gt;\n &amp;lt;path d=&amp;quot;M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.66-1.455-3.66-1.455-.495-1.26-1.2-1.59-1.2-1.59-.975-.66.075-.645.075-.645 1.08.075 1.65 1.11 1.65 1.11 0.96 1.635 2.505 1.17 3.12.885.09-.69.375-1.17.675-1.44-2.55-.285-5.22-1.275-5.22-5.67 0-1.26.45-2.28 1.185-3.09-.12-.285-.51-1.425.105-2.97 0 0 .975-.315 3.195 1.185.93-.255 1.92-.375 2.91-.375s1.98.12 2.91.375c2.22-1.5 3.195-1.185 3.195-1.185.615 1.545.225 2.685.105 2.97.735.81 1.185 1.83 1.185 3.09 0 4.41-2.67 5.385-5.22 5.67.405.345.765 1.02.765 2.07 0 1.5-.015 2.715-.015 3.09 0 .315.225.69.825.57C20.565 21.795 24 17.31 24 12c0-6.63-5.37-12-12-12z&amp;quot;/&amp;gt;\n &amp;lt;/svg&amp;gt;\n GitHub\n &amp;lt;/a&amp;gt;\n \n ","disable_math":true}},{"type":"object","name":"Spacer","id":"p1047","attributes":{"name":"Spacer00131","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"height":10,"min_height":10,"margin":0,"align":"start"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1048","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;Disclaimer:&amp;lt;/b&amp;gt; This scan only evaluates Python files. Security weaknesses can also exist in other files used by a Python package.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;This SAST tool &amp;lt;a href=&amp;quot;https://github.com/nocomplexity/codeaudit&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Python Code Audit&amp;lt;/a&amp;gt; provides a powerful, automatic security analysis for Python source code. However, it&amp;#x27;s not a substitute for human review in combination with business knowledge. Undetected vulnerabilities may still exist.&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&amp;quot;https://nocomplexity.com/documents/codeaudit/intro.html&amp;quot;&amp;gt;Python Code Audit&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt; Dashboard - version 1.7.1&amp;lt;/p&amp;gt;","disable_math":true}}]}}],"defs":[{"type":"model","name":"ReactiveHTML1"},{"type":"model","name":"FlexBox1","properties":[{"name":"align_content","kind":"Any","default":"flex-start"},{"name":"align_items","kind":"Any","default":"flex-start"},{"name":"flex_direction","kind":"Any","default":"row"},{"name":"flex_wrap","kind":"Any","default":"wrap"},{"name":"gap","kind":"Any","default":""},{"name":"justify_content","kind":"Any","default":"flex-start"}]},{"type":"model","name":"FloatPanel1","properties":[{"name":"config","kind":"Any","default":{"type":"map"}},{"name":"contained","kind":"Any","default":true},{"name":"position","kind":"Any","default":"right-top"},{"name":"offsetx","kind":"Any","default":null},{"name":"offsety","kind":"Any","default":null},{"name":"theme","kind":"Any","default":"primary"},{"name":"status","kind":"Any","default":"normalized"}]},{"type":"model","name":"GridStack1","properties":[{"name":"ncols","kind":"Any","default":null},{"name":"nrows","kind":"Any","default":null},{"name":"allow_resize","kind":"Any","default":true},{"name":"allow_drag","kind":"Any","default":true},{"name":"state","kind":"Any","default":[]}]},{"type":"model","name":"drag1","properties":[{"name":"slider_width","kind":"Any","default":5},{"name":"slider_color","kind":"Any","default":"black"},{"name":"start","kind":"Any","default":0},{"name":"end","kind":"Any","default":100},{"name":"value","kind":"Any","default":50}]},{"type":"model","name":"click1","properties":[{"name":"terminal_output","kind":"Any","default":""},{"name":"debug_name","kind":"Any","default":""},{"name":"clears","kind":"Any","default":0}]},{"type":"model","name":"ReactiveESM1","properties":[{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"JSComponent1","properties":[{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"ReactComponent1","properties":[{"name":"use_shadow_dom","kind":"Any","default":true},{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"AnyWidgetComponent1","properties":[{"name":"use_shadow_dom","kind":"Any","default":true},{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"FastWrapper1","properties":[{"name":"object","kind":"Any","default":null},{"name":"style","kind":"Any","default":null}]},{"type":"model","name":"NotificationArea1","properties":[{"name":"js_events","kind":"Any","default":{"type":"map"}},{"name":"max_notifications","kind":"Any","default":5},{"name":"notifications","kind":"Any","default":[]},{"name":"position","kind":"Any","default":"bottom-right"},{"name":"_clear","kind":"Any","default":0},{"name":"types","kind":"Any","default":[{"type":"map","entries":[["type","warning"],["background","#ffc107"],["icon",{"type":"map","entries":[["className","fas fa-exclamation-triangle"],["tagName","i"],["color","white"]]}]]},{"type":"map","entries":[["type","info"],["background","#007bff"],["icon",{"type":"map","entries":[["className","fas fa-info-circle"],["tagName","i"],["color","white"]]}]]}]}]},{"type":"model","name":"Notification","properties":[{"name":"background","kind":"Any","default":null},{"name":"duration","kind":"Any","default":3000},{"name":"icon","kind":"Any","default":null},{"name":"message","kind":"Any","default":""},{"name":"notification_type","kind":"Any","default":null},{"name":"_rendered","kind":"Any","default":false},{"name":"_destroyed","kind":"Any","default":false}]},{"type":"model","name":"TemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"BootstrapTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"TemplateEditor1","properties":[{"name":"layout","kind":"Any","default":[]}]},{"type":"model","name":"MaterialTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"request_value1","properties":[{"name":"fill","kind":"Any","default":"none"},{"name":"_synced","kind":"Any","default":null},{"name":"_request_sync","kind":"Any","default":0}]}]}}
258
+ {"2e885c2a-1c77-4062-b0c4-c9ce5c53a26b":{"version":"3.8.2","title":"Python Security Code Audit","config":{"type":"object","name":"DocumentConfig","id":"p1009","attributes":{"reconnect_session":false,"notify_connection_status":false,"notifications":null}},"roots":[{"type":"object","name":"panel.models.location.Location","id":"p1011","attributes":{"name":"location","reload":false}},{"type":"object","name":"panel.models.markup.HTML","id":"p1017","attributes":{"name":"js_area","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1015","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1051","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/bundled/theme/material.css"}}],"width":0,"height":0,"margin":0,"sizing_mode":"fixed","align":"start","disable_math":true}},{"type":"object","name":"panel.models.reactive_html.ReactiveHTML","id":"p1019","attributes":{"name":"actions","subscribed_events":{"type":"set","entries":["dom_event"]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":0,"align":"start","data":{"type":"object","name":"MaterialTemplateActions1","id":"p1018","attributes":{"name":"MaterialTemplateActions00143","tags":["__ref:p1019"]}},"scripts":{"type":"map","entries":[["open_modal",["modal.open();\nsetTimeout(function() {{\n window.dispatchEvent(new Event(&amp;#x27;resize&amp;#x27;));\n}}, 200);"]],["close_modal",["modal.close()"]]]}}},{"type":"object","name":"panel.models.browser.BrowserInfo","id":"p1020","attributes":{"name":"browser_info"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1022","attributes":{"name":"busy_indicator","css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 20px; }","\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1021","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/loadingspinner.css"}},{"id":"p1051"}],"min_width":20,"min_height":20,"margin":[5,10],"align":"start"}},{"type":"object","name":"panel.models.layout.Column","id":"p1023","attributes":{"name":"main-124303472038352","tags":["main"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1016","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/listpanel.css"}},{"id":"p1051"}],"min_width":0,"min_height":0,"margin":0,"sizing_mode":"stretch_both","align":"start","children":[{"type":"object","name":"panel.models.tabs.Tabs","id":"p1024","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"min_width":0,"min_height":0,"margin":0,"sizing_mode":"stretch_both","align":"start","tabs":[{"type":"object","name":"TabPanel","id":"p1026","attributes":{"name":"HTML00123","title":"Package Overview","child":{"type":"object","name":"panel.models.markup.HTML","id":"p1025","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"\u26a0\ufe0f No scan result","disable_math":true}}}},{"type":"object","name":"TabPanel","id":"p1028","attributes":{"name":"HTML00123","title":"Used Modules","child":{"type":"object","name":"Spacer","id":"p1027","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1030","attributes":{"name":"HTML00123","title":"Complexity Insights","child":{"type":"object","name":"Spacer","id":"p1029","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1032","attributes":{"name":"HTML00123","title":"Weaknesses Overview","child":{"type":"object","name":"Spacer","id":"p1031","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1034","attributes":{"name":"HTML00123","title":"Weaknesses per file","child":{"type":"object","name":"Spacer","id":"p1033","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1036","attributes":{"name":"HTML00123","title":"Weaknesses Details","child":{"type":"object","name":"Spacer","id":"p1035","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}}]}}]}},{"type":"object","name":"panel.models.layout.Column","id":"p1037","attributes":{"name":"nav-124303472934400","tags":["nav"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1016"},{"id":"p1051"}],"min_width":300,"margin":0,"sizing_mode":"stretch_width","align":"start","children":[{"type":"object","name":"panel.models.markup.HTML","id":"p1039","attributes":{"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1038","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/markdown.css"}},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&amp;lt;h2 id=&amp;quot;package-code-security-scan&amp;quot;&amp;gt;Package Code Security Scan &amp;lt;a class=&amp;quot;header-anchor&amp;quot; href=&amp;quot;#package-code-security-scan&amp;quot;&amp;gt;\u00b6&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;\n"}},{"type":"object","name":"panel.models.widgets.TextInput","id":"p1040","attributes":{"subscribed_events":{"type":"set","entries":["enter-pressed"]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"width":300,"min_width":300,"margin":[5,10],"align":"start","title":"Python Package Name","placeholder":"Enter PyPI package (e.g., requests)...","max_length":5000}},{"type":"object","name":"panel.models.widgets.Button","id":"p1042","attributes":{"button_type":"primary","subscribed_events":{"type":"set","entries":["button_click"]},"css_classes":["solid"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1041","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/button.css"}},{"id":"p1051"}],"margin":[5,10],"align":"start","label":"Start Scan"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1043","attributes":{"css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 60px; }","\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1021"},{"id":"p1051"}],"min_width":60,"min_height":60,"margin":[5,10],"align":"start","text":"&amp;lt;span&amp;gt;&amp;lt;b&amp;gt;Scanning...&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1044","attributes":{"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1038"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&amp;lt;h3&amp;gt;Ready to scan.&amp;lt;/h3&amp;gt;\n"}},{"type":"object","name":"Spacer","id":"p1045","attributes":{"name":"Spacer00130","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"height":20,"min_height":20,"margin":0,"align":"start"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1046","attributes":{"styles":{"type":"map","entries":[["background","linear-gradient(135deg, #F0FDF4, #ECFDF5)"],["padding","18px"],["min-width","200px"],["font-size","15px"],["color","#1F2937"],["border","1px solid #D1FAE5"],["border-left","4px solid #10B981"],["border-radius","12px"],["box-shadow","0 2px 6px rgba(0, 0, 0, 0.05)"]]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"},"\n .bk-panel {\n background: transparent !important;\n }\n "],"min_width":0,"margin":[5,10],"sizing_mode":"stretch_width","align":"start","text":"\n &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Python Code Audit&amp;lt;/b&amp;gt; is a Static Application Security Testing (SAST) tool used to find security weaknesses in Python code.&amp;lt;/p&amp;gt;\n &amp;lt;p&amp;gt;Use the CLI version for powerful command-line scanning with many more options.&amp;lt;p&amp;gt;\n &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; \n &amp;lt;a href=&amp;quot;https://nocomplexity.com/documents/codeaudit/intro.html&amp;quot;\n target=&amp;quot;_blank&amp;quot;\n style=&amp;quot;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background-color: #24292f;\n color: white;\n text-decoration: none;\n border-radius: 8px;\n font-weight: 600;\n font-size: 15px;\n transition: all 0.2s ease;\n width: 200px;\n &amp;quot;&amp;gt;Documentation\n &amp;lt;/a&amp;gt;\n &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;\n &amp;lt;a href=&amp;quot;https://github.com/nocomplexity/codeaudit&amp;quot;\n target=&amp;quot;_blank&amp;quot;\n style=&amp;quot;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background-color: #24292f;\n color: white;\n text-decoration: none;\n border-radius: 8px;\n font-weight: 600;\n font-size: 15px;\n transition: all 0.2s ease;\n width: 200px;\n &amp;quot;&amp;gt;\n &amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;20&amp;quot; height=&amp;quot;20&amp;quot; fill=&amp;quot;currentColor&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot;&amp;gt;\n &amp;lt;path d=&amp;quot;M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.66-1.455-3.66-1.455-.495-1.26-1.2-1.59-1.2-1.59-.975-.66.075-.645.075-.645 1.08.075 1.65 1.11 1.65 1.11 0.96 1.635 2.505 1.17 3.12.885.09-.69.375-1.17.675-1.44-2.55-.285-5.22-1.275-5.22-5.67 0-1.26.45-2.28 1.185-3.09-.12-.285-.51-1.425.105-2.97 0 0 .975-.315 3.195 1.185.93-.255 1.92-.375 2.91-.375s1.98.12 2.91.375c2.22-1.5 3.195-1.185 3.195-1.185.615 1.545.225 2.685.105 2.97.735.81 1.185 1.83 1.185 3.09 0 4.41-2.67 5.385-5.22 5.67.405.345.765 1.02.765 2.07 0 1.5-.015 2.715-.015 3.09 0 .315.225.69.825.57C20.565 21.795 24 17.31 24 12c0-6.63-5.37-12-12-12z&amp;quot;/&amp;gt;\n &amp;lt;/svg&amp;gt;\n GitHub\n &amp;lt;/a&amp;gt;\n \n ","disable_math":true}},{"type":"object","name":"Spacer","id":"p1047","attributes":{"name":"Spacer00131","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"height":10,"min_height":10,"margin":0,"align":"start"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1048","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;Disclaimer:&amp;lt;/b&amp;gt; This scan only evaluates Python files. Security weaknesses can also exist in other files used by a Python package.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;This SAST tool &amp;lt;a href=&amp;quot;https://github.com/nocomplexity/codeaudit&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Python Code Audit&amp;lt;/a&amp;gt; provides a powerful, automatic security analysis for Python source code. However, it&amp;#x27;s not a substitute for human review in combination with business knowledge. Undetected vulnerabilities may still exist.&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&amp;quot;https://nocomplexity.com/documents/codeaudit/intro.html&amp;quot;&amp;gt;Python Code Audit&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt; Dashboard - version 1.8.0&amp;lt;/p&amp;gt;","disable_math":true}}]}}],"defs":[{"type":"model","name":"ReactiveHTML1"},{"type":"model","name":"FlexBox1","properties":[{"name":"align_content","kind":"Any","default":"flex-start"},{"name":"align_items","kind":"Any","default":"flex-start"},{"name":"flex_direction","kind":"Any","default":"row"},{"name":"flex_wrap","kind":"Any","default":"wrap"},{"name":"gap","kind":"Any","default":""},{"name":"justify_content","kind":"Any","default":"flex-start"}]},{"type":"model","name":"FloatPanel1","properties":[{"name":"config","kind":"Any","default":{"type":"map"}},{"name":"contained","kind":"Any","default":true},{"name":"position","kind":"Any","default":"right-top"},{"name":"offsetx","kind":"Any","default":null},{"name":"offsety","kind":"Any","default":null},{"name":"theme","kind":"Any","default":"primary"},{"name":"status","kind":"Any","default":"normalized"}]},{"type":"model","name":"GridStack1","properties":[{"name":"ncols","kind":"Any","default":null},{"name":"nrows","kind":"Any","default":null},{"name":"allow_resize","kind":"Any","default":true},{"name":"allow_drag","kind":"Any","default":true},{"name":"state","kind":"Any","default":[]}]},{"type":"model","name":"drag1","properties":[{"name":"slider_width","kind":"Any","default":5},{"name":"slider_color","kind":"Any","default":"black"},{"name":"start","kind":"Any","default":0},{"name":"end","kind":"Any","default":100},{"name":"value","kind":"Any","default":50}]},{"type":"model","name":"click1","properties":[{"name":"terminal_output","kind":"Any","default":""},{"name":"debug_name","kind":"Any","default":""},{"name":"clears","kind":"Any","default":0}]},{"type":"model","name":"ReactiveESM1","properties":[{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"JSComponent1","properties":[{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"ReactComponent1","properties":[{"name":"use_shadow_dom","kind":"Any","default":true},{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"AnyWidgetComponent1","properties":[{"name":"use_shadow_dom","kind":"Any","default":true},{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"FastWrapper1","properties":[{"name":"object","kind":"Any","default":null},{"name":"style","kind":"Any","default":null}]},{"type":"model","name":"NotificationArea1","properties":[{"name":"js_events","kind":"Any","default":{"type":"map"}},{"name":"max_notifications","kind":"Any","default":5},{"name":"notifications","kind":"Any","default":[]},{"name":"position","kind":"Any","default":"bottom-right"},{"name":"_clear","kind":"Any","default":0},{"name":"types","kind":"Any","default":[{"type":"map","entries":[["type","warning"],["background","#ffc107"],["icon",{"type":"map","entries":[["className","fas fa-exclamation-triangle"],["tagName","i"],["color","white"]]}]]},{"type":"map","entries":[["type","info"],["background","#007bff"],["icon",{"type":"map","entries":[["className","fas fa-info-circle"],["tagName","i"],["color","white"]]}]]}]}]},{"type":"model","name":"Notification","properties":[{"name":"background","kind":"Any","default":null},{"name":"duration","kind":"Any","default":3000},{"name":"icon","kind":"Any","default":null},{"name":"message","kind":"Any","default":""},{"name":"notification_type","kind":"Any","default":null},{"name":"_rendered","kind":"Any","default":false},{"name":"_destroyed","kind":"Any","default":false}]},{"type":"model","name":"TemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"BootstrapTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"TemplateEditor1","properties":[{"name":"layout","kind":"Any","default":[]}]},{"type":"model","name":"MaterialTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"request_value1","properties":[{"name":"fill","kind":"Any","default":"none"},{"name":"_synced","kind":"Any","default":null},{"name":"_request_sync","kind":"Any","default":0}]}]}}
259
259
  </script>
260
260
  <script type="text/javascript">
261
261
  (function() {
@@ -264,7 +264,7 @@
264
264
  (function(root) {
265
265
  function embed_document(root) {
266
266
  const docs_json = document.getElementById('p1052').textContent;
267
- const render_items = [{"docid":"0d156486-1f3b-4c0e-8d22-590703d045a9","roots":{"p1011":"a4877837-e5a9-4774-b4d7-ad0dd7a4cf3d","p1017":"cb933ecc-cd4a-4704-a54d-63fee7cbf015","p1019":"af28ffa7-df41-4874-8c1d-9c3b08a038e6","p1020":"a0ba89f2-9c84-4fbd-bdff-b3111255f928","p1022":"b3bd5fe7-bbca-438b-b7d9-05fc35e95bc9","p1023":"a057f352-2c7d-4d41-bd74-b480f017f4fa","p1037":"e04b0cd0-6af2-4037-9fec-71defeb94848"},"root_ids":["p1011","p1017","p1019","p1020","p1022","p1023","p1037"]}];
267
+ const render_items = [{"docid":"2e885c2a-1c77-4062-b0c4-c9ce5c53a26b","roots":{"p1011":"bb9b342b-3096-47e1-ac4a-16ca03b54925","p1017":"e9ccbf6a-6f30-42d1-80c6-ada3ae97aba4","p1019":"c6a7efe4-ab93-47f6-bbe3-419006d99dc8","p1020":"aef73531-bc99-4369-b79b-503e6ae0186c","p1022":"c1428a5c-5ce8-406f-a339-ecf99154f423","p1023":"d2afc85a-cbd4-4aaa-92ad-6c9fc69fc719","p1037":"d918edd0-838c-4f35-96b7-93e388d4fc8c"},"root_ids":["p1011","p1017","p1019","p1020","p1022","p1023","p1037"]}];
268
268
  root.Bokeh.embed.embed_items(docs_json, render_items);
269
269
  }
270
270
  if (root.Bokeh !== undefined) {