Data Apps & Dashboards for Python. No JavaScript Required.
This report presents the forensic synthetic code analysis of plotly/dash, a Python project with 24,311 GitHub stars. SynthScan v2.0 examined 293,068 lines of code across 1127 source files, recording 810 pattern matches distributed across 18 syntactic categories. The overall adjusted score of 4.5 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 810 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unit/mcp/test_mcp_session.py | 28 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_session.py | 30 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_server.py | 10 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_server.py | 12 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_server.py | 48 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_server.py | 50 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 36 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 38 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 78 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 80 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 105 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 107 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 126 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 128 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 143 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 145 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 176 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 178 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 211 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 213 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 228 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 230 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 250 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/test_mcp_configure.py | 252 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_pattern_matching.py | 14 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_pattern_matching.py | 16 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_pattern_matching.py | 90 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_pattern_matching.py | 92 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 29 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 31 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 142 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 144 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 202 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 204 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 217 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 219 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 312 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_tools.py | 314 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_background_callbacks.py | 22 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_background_callbacks.py | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_background_callbacks.py | 86 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_background_callbacks.py | 88 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_background_callbacks.py | 177 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_background_callbacks.py | 179 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_background_callbacks.py | 241 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_background_callbacks.py | 243 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/unit/mcp/tools/test_mcp_formatted_output_results.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/unit/mcp/tools/test_mcp_formatted_output_results.py | 28 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/unit/mcp/tools/test_mcp_formatted_output_results.py | 79 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/unit/mcp/tools/test_mcp_formatted_output_results.py | 81 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/unit/mcp/tools/test_mcp_formatted_output_results.py | 168 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/unit/mcp/tools/test_mcp_formatted_output_results.py | 170 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/unit/mcp/tools/test_mcp_formatted_output_results.py | 204 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ts/unit/mcp/tools/test_mcp_formatted_output_results.py | 206 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_input_descriptions.py | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_input_descriptions.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_input_descriptions.py | 48 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_input_descriptions.py | 50 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_input_descriptions.py | 192 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/mcp/tools/test_mcp_input_descriptions.py | 194 | # --------------------------------------------------------------------------- | COMMENT |
| 64 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/unit/test_configs.py | 78 | def test_pathname_prefix_from_environ_app_name(empty_environ): | CODE |
| LOW⚡ | tests/unit/test_configs.py | 85 | def test_pathname_prefix_environ_routes(empty_environ): | CODE |
| LOW⚡ | tests/unit/test_configs.py | 91 | def test_pathname_prefix_environ_requests(empty_environ): | CODE |
| LOW⚡ | tests/unit/test_configs.py | 472 | def test_debug_mode_enable_dev_tools(empty_environ, debug_env, debug, expected): | CODE |
| LOW⚡ | tests/unit/test_configs.py | 480 | def test_missing_flask_compress_raises(): | CODE |
| LOW⚡ | tests/unit/test_configs.py | 485 | def test_csrf_config_defaults(): | CODE |
| LOW⚡ | tests/unit/test_configs.py | 516 | def test_csrf_config_validation(token_name, header_name): | CODE |
| LOW⚡ | tests/unit/test_configs.py | 521 | def test_csrf_config_read_only(): | CODE |
| LOW⚡ | tests/unit/test_configs.py | 529 | def test_init_app_with_flask_run_pattern(): | CODE |
| LOW | tests/unit/test_configs.py | 43 | def test_valid_pathname_prefix_init( | CODE |
| LOW | tests/unit/test_configs.py | 55 | def test_invalid_pathname_prefix(empty_environ): | CODE |
| LOW | tests/unit/test_configs.py | 105 | def test_pathname_prefix_assets(empty_environ, req, expected): | CODE |
| LOW | tests/unit/test_configs.py | 188 | def test_get_combined_config_dev_tools_ui(empty_environ): | CODE |
| LOW | tests/unit/test_configs.py | 202 | def test_get_combined_config_props_check(empty_environ): | CODE |
| LOW | tests/unit/test_configs.py | 216 | def test_load_dash_env_vars_refects_to_os_environ(empty_environ): | CODE |
| LOW | tests/unit/test_configs.py | 257 | def test_pathname_prefix_relative_url(prefix, partial_path, expected): | CODE |
| LOW | tests/unit/test_configs.py | 266 | def test_invalid_get_relative_path(prefix, partial_path): | CODE |
| LOW | tests/unit/test_configs.py | 308 | def test_invalid_strip_relative_path(prefix, partial_path): | CODE |
| LOW | tests/unit/test_configs.py | 429 | def test_app_invalid_delayed_config(): | CODE |
| LOW | tests/unit/test_configs.py | 505 | def test_csrf_config_in_index(): | CODE |
| LOW | tests/unit/test_configs.py | 551 | def test_init_app_server_false_pattern(): | CODE |
| LOW | tests/unit/test_resources.py | 107 | def test_collect_and_register_resources(mocker): | CODE |
| LOW | tests/unit/test_resources.py | 127 | def test_resources_with_attributes(): | CODE |
| LOW | tests/unit/test_resources.py | 160 | def test_css_resources_with_attributes(): | CODE |
| LOW | tests/unit/test_resources.py | 187 | def test_resources_without_attributes(): | CODE |
| LOW | tests/unit/test_resources.py | 200 | def test_local_resources_with_attributes(mocker): | CODE |
| LOW | tests/unit/test_resources.py | 235 | def test_multiple_external_urls_with_attributes(): | CODE |
| LOW⚡ | tests/unit/test_pydantic_types.py | 10 | def test_json_schema_is_number(self): | CODE |
| LOW⚡ | tests/unit/test_pydantic_types.py | 16 | def test_produces_object_schema(self): | CODE |
| LOW⚡ | tests/unit/test_pydantic_types.py | 21 | def test_schema_has_type_and_props(self): | CODE |
| LOW⚡ | tests/unit/test_pydantic_types.py | 29 | def test_dispatch_body_schema(self): | CODE |
| LOW⚡ | tests/unit/test_pydantic_types.py | 34 | def test_dispatch_response_schema(self): | CODE |
| LOW | tests/unit/test_app_runners.py | 10 | def test_threaded_server_smoke(dash_thread_server): | CODE |
| LOW | tests/unit/test_app_runners.py | 28 | def test_process_server_smoke(dash_process_server): | CODE |
| LOW | tests/unit/test_health_endpoint_unit.py | 39 | def test_health_respects_routes_pathname_prefix(): | CODE |
| LOW | tests/unit/test_health_endpoint_unit.py | 51 | def test_health_custom_nested_path(): | CODE |
| LOW | tests/unit/test_browser.py | 21 | def test_browser_use_remote_webdriver(tmpdir): | CODE |
| LOW | tests/unit/test_async_background_callback_job_fn.py | 63 | def test_diskcache_async_job_fn_exception_is_reported(): | CODE |
| LOW⚡ | tests/unit/test_async_background_callback_job_fn.py | 74 | def test_diskcache_async_job_fn_prevent_update_is_reported(): | CODE |
| LOW⚡ | tests/unit/test_async_background_callback_job_fn.py | 84 | def test_diskcache_async_job_fn_success_is_reported(): | CODE |
| LOW⚡ | tests/unit/test_async_background_callback_job_fn.py | 94 | def test_celery_async_job_fn_exception_is_reported(): | CODE |
| LOW | tests/unit/test_async_background_callback_job_fn.py | 105 | def test_celery_async_job_fn_prevent_update_is_reported(): | CODE |
| LOW | tests/unit/test_async_background_callback_job_fn.py | 115 | def test_celery_async_job_fn_success_is_reported(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 8 | def test_callback_returns_callable(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 14 | def test_callback_decorates_function(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 25 | def test_callback_signature_includes_typed_options(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 47 | def test_callback_with_multiple_inputs(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 75 | def test_callback_with_multiple_outputs(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 89 | def test_callback_preserves_docstring(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 100 | def test_callback_with_prevent_initial_call(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 114 | def test_callback_with_background_params(): | CODE |
| LOW | tests/unit/test_callback_unit.py | 125 | def test_callback_module_export(): | CODE |
| LOW | tests/unit/test_layout.py | 31 | def test_yields_all_components_with_correct_ancestors(self, sample_layout): | CODE |
| LOW⚡ | tests/unit/test_layout.py | 50 | def test_returns_none_for_missing_id(self, sample_layout): | CODE |
| LOW⚡ | tests/unit/test_layout.py | 59 | def test_extracts_all_text_content(self, sample_layout): | CODE |
| LOW⚡ | tests/unit/test_layout.py | 68 | def test_returns_dict_for_wildcard(self, wildcard): | CODE |
| LOW⚡ | tests/unit/test_layout.py | 76 | def test_returns_none_for_plain_string(self): | CODE |
| LOW⚡ | tests/unit/test_layout.py | 79 | def test_returns_none_for_non_wildcard_dict(self): | CODE |
| LOW⚡ | tests/unit/test_layout.py | 82 | def test_returns_none_for_invalid_json(self): | CODE |
| LOW⚡ | tests/unit/test_websocket_executor.py | 24 | def test_websocket_max_workers_default(): | CODE |
| 229 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/unit/mcp/tools/test_mcp_input_schemas.py | 41 | """``{anyOf: [*schemas, {type: null}]}`` — a common nullable-type shape.""" | STRING |
| HIGH | tests/backend_tests/test_preconfig_backends.py | 32 | window._lastResponseHeaders = null; | STRING |
| HIGH | tests/integration/callbacks/test_basic_callback.py | 458 | dash_duo.wait_for_text_to_equal("#output", '[null, null, "A"]') | CODE |
| HIGH | tests/integration/callbacks/test_basic_callback.py | 461 | dash_duo.wait_for_text_to_equal("#output", '[null, 1, "A"]') | CODE |
| HIGH | tests/integration/callbacks/test_callback_context.py | 91 | '[{"prop_id": ".", "value": null}]', | CODE |
| HIGH | …_clientside_multiple_output_return_single_no_update.py | 26 | return [null, null]; | STRING |
| HIGH⚡ | tests/integration/clientside/test_clientside.py | 417 | "btn0.n_clicks = null, " | CODE |
| HIGH⚡ | tests/integration/clientside/test_clientside.py | 418 | '{"btn1":0}.n_clicks = null, ' | CODE |
| HIGH⚡ | tests/integration/clientside/test_clientside.py | 419 | '{"btn1":1}.n_clicks = null, ' | CODE |
| HIGH | tests/integration/clientside/test_clientside.py | 430 | '{"btn1":0}.n_clicks = null, ' | CODE |
| HIGH | tests/integration/clientside/test_clientside.py | 431 | '{"btn1":1}.n_clicks = null, ' | CODE |
| HIGH | tests/integration/clientside/test_clientside.py | 444 | '{"btn1":1}.n_clicks = null, ' | CODE |
| HIGH | tests/integration/clientside/test_clientside.py | 456 | '{"btn1":1}.n_clicks = null, ' | CODE |
| HIGH⚡ | tests/integration/clientside/test_clientside.py | 556 | "in0.value = null, " | CODE |
| HIGH⚡ | tests/integration/clientside/test_clientside.py | 557 | '{"in1":0}.value = null, ' | CODE |
| HIGH⚡ | tests/integration/clientside/test_clientside.py | 558 | '{"in1":1}.value = null, ' | CODE |
| HIGH | tests/integration/clientside/test_clientside.py | 569 | '{"in1":0}.value = null, ' | CODE |
| HIGH | tests/integration/clientside/test_clientside.py | 570 | '{"in1":1}.value = null, ' | CODE |
| HIGH | tests/integration/clientside/test_clientside.py | 582 | '{"in1":1}.value = null, ' | CODE |
| HIGH | tests/integration/clientside/test_clientside.py | 594 | '{"in1":1}.value = null, ' | CODE |
| HIGH | tests/async_tests/test_async_callbacks.py | 467 | dash_duo.wait_for_text_to_equal("#output", '[null, null, "A"]') | CODE |
| HIGH | tests/async_tests/test_async_callbacks.py | 470 | dash_duo.wait_for_text_to_equal("#output", '[null, 1, "A"]') | CODE |
| HIGH | …ore-components/tests/integration/dropdown/test_a11y.py | 343 | return dropdownContent && dropdownContent.contains(activeElement); | STRING |
| HIGH | …ore-components/tests/integration/dropdown/test_a11y.py | 409 | if (focused && focused.closest('.dash-options-list-option')) { | STRING |
| HIGH | …ore-components/tests/integration/dropdown/test_a11y.py | 412 | return null; | STRING |
| HIGH | …ts/tests/integration/loading/test_loading_component.py | 264 | "return gd_ === window.gd && gd_.__test__ === 'boo';" | CODE |
| HIGH | …-components/tests/integration/input/test_a11y_input.py | 66 | return container === activeElement || container.contains(activeElement); | STRING |
| HIGH | …s/tests/integration/location/test_location_callback.py | 173 | window._test_link_event_counter = (window._test_link_event_counter || 0) + 1; | STRING |
| HIGH | …s/tests/integration/location/test_location_callback.py | 177 | window._test_history_event_counter = (window._test_history_event_counter || 0) + 1; | STRING |
| HIGH | …nents/tests/integration/graph/test_graph_responsive.py | 109 | # responsive=true will make the graph resize only if autosize=true|undefined, interestingly enough, responsive=undef | COMMENT |
| HIGH⚡ | …components/tests/integration/graph/test_graph_varia.py | 765 | figure.layout.title = {text: String(n_fig || 0)}; | CODE |
| HIGH⚡ | …components/tests/integration/graph/test_graph_varia.py | 773 | layout: {width: 300, height: 250, title: {text: String(n_fig || 0)}} | CODE |
| HIGH⚡ | …components/tests/integration/graph/test_graph_varia.py | 783 | let responsive = [true, false, 'auto'][(n_resp || 0) % 3]; | CODE |
| HIGH⚡ | …components/tests/integration/graph/test_graph_varia.py | 784 | return [new_figure, responsive, (n_fig || 0) + ' ' + responsive]; | CODE |
| HIGH | …e-components/tests/integration/link/test_link_event.py | 30 | window._test_link_event_counter = (window._test_link_event_counter || 0) + 1; | STRING |
| HIGH | …e-components/tests/integration/link/test_link_event.py | 34 | window._test_history_event_counter = (window._test_history_event_counter || 0) + 1; | STRING |
| HIGH | …/tests/integration/download/test_download_dataframe.py | 51 | assert df.columns.equals(df_download.columns) | CODE |
| HIGH | …/tests/integration/download/test_download_dataframe.py | 52 | assert df.index.equals(df_download.index) | CODE |
| HIGH⚡ | …onents/tests/integration/store/test_component_props.py | 179 | "#output", '[{"n_clicks": null}, {"n_clicks": null}, {"n_clicks": null}]' | CODE |
| HIGH⚡ | …onents/tests/integration/store/test_component_props.py | 188 | dash_dcc.wait_for_text_to_equal("#output", "[null, null, null]") | CODE |
| HIGH⚡ | …onents/tests/integration/store/test_component_props.py | 198 | "#output", '[{"n_clicks": null}, {"n_clicks": null}, {"n_clicks": null}]' | CODE |
| HIGH | components/dash-table/tests/selenium/test_export.py | 28 | assert df_bis.equals(df) | CODE |
| HIGH | dash/development/base_component.py | 373 | # A component's children can be undefined, a string, another component, | COMMENT |
| HIGH | dash/development/_r_components_generation.py | 22 | props <- props[!vapply(props, is.null, logical(1))] | CODE |
| HIGH | dash/testing/browser.py | 192 | stash.push(c); | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/utils.py | 4 | CODE | |
| LOW | tests/unit/test_resources.py | 3 | CODE | |
| LOW | tests/integration/test_legacy_components.py | 7 | CODE | |
| LOW | tests/integration/dash/org.py | 3 | CODE | |
| LOW | @plotly/dash-test-components/base/__init__.py | 12 | CODE | |
| LOW | …h-generator-test-component-typescript/base/__init__.py | 12 | CODE | |
| LOW | …ash-generator-test-component-standard/base/__init__.py | 12 | CODE | |
| LOW | …/dash-generator-test-component-nested/base/__init__.py | 12 | CODE | |
| LOW | …-core-components/dash_core_components_base/__init__.py | 7 | CODE | |
| LOW | …-core-components/dash_core_components_base/__init__.py | 9 | CODE | |
| LOW | …-core-components/dash_core_components_base/__init__.py | 9 | CODE | |
| LOW | …-core-components/dash_core_components_base/__init__.py | 9 | CODE | |
| LOW | …-core-components/dash_core_components_base/__init__.py | 9 | CODE | |
| LOW | components/dash-html-components/tests/utils.py | 1 | CODE | |
| LOW | …-html-components/dash_html_components_base/__init__.py | 3 | CODE | |
| LOW | components/dash-table/dash_table_base/__init__.py | 18 | CODE | |
| LOW | components/dash-table/dash_table_base/__init__.py | 20 | CODE | |
| LOW | components/dash-table/dash_table_base/__init__.py | 21 | CODE | |
| LOW | dash/__init__.py | 5 | CODE | |
| LOW | dash/__init__.py | 5 | CODE | |
| LOW | dash/__init__.py | 5 | CODE | |
| LOW | dash/__init__.py | 5 | CODE | |
| LOW | dash/__init__.py | 5 | CODE | |
| LOW | dash/__init__.py | 5 | CODE | |
| LOW | dash/__init__.py | 5 | CODE | |
| LOW | dash/__init__.py | 14 | CODE | |
| LOW | dash/__init__.py | 15 | CODE | |
| LOW | dash/__init__.py | 16 | CODE | |
| LOW | dash/__init__.py | 17 | CODE | |
| LOW | dash/__init__.py | 18 | CODE | |
| LOW | dash/__init__.py | 19 | CODE | |
| LOW | dash/__init__.py | 20 | CODE | |
| LOW | dash/__init__.py | 21 | CODE | |
| LOW | dash/__init__.py | 22 | CODE | |
| LOW | dash/__init__.py | 22 | CODE | |
| LOW | dash/__init__.py | 23 | CODE | |
| LOW | dash/__init__.py | 24 | CODE | |
| LOW | dash/__init__.py | 24 | CODE | |
| LOW | dash/__init__.py | 24 | CODE | |
| LOW | dash/__init__.py | 29 | CODE | |
| LOW | dash/__init__.py | 30 | CODE | |
| LOW | dash/__init__.py | 30 | CODE | |
| LOW | dash/__init__.py | 34 | CODE | |
| LOW | dash/__init__.py | 37 | CODE | |
| LOW | dash/__init__.py | 37 | CODE | |
| LOW | dash/__init__.py | 38 | CODE | |
| LOW | dash/__init__.py | 38 | CODE | |
| LOW | dash/__init__.py | 38 | CODE | |
| LOW | dash/__init__.py | 43 | CODE | |
| LOW | dash/__init__.py | 44 | CODE | |
| LOW | dash/__init__.py | 46 | CODE | |
| LOW | dash/dash.py | 994 | CODE | |
| LOW | dash/_layout_utils.py | 3 | CODE | |
| LOW | dash/_validate.py | 598 | CODE | |
| LOW | dash/_validate.py | 605 | CODE | |
| LOW | dash/_jupyter.py | 396 | CODE | |
| LOW | dash/development/__init__.py | 1 | CODE | |
| LOW | dash/backends/base_server.py | 6 | CODE | |
| LOW | dash/backends/base_server.py | 21 | CODE | |
| LOW | dash/backends/_flask.py | 1 | CODE | |
| 104 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/backend_tests/test_threaded_runner_stop.py | 73 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | tests/integration/test_hooks.py | 260 | except Exception: | CODE |
| LOW | tests/integration/test_hooks.py | 269 | except Exception: | CODE |
| LOW | tests/integration/test_hooks.py | 282 | except Exception as err: | CODE |
| MEDIUM | tests/integration/test_hooks.py | 256 | def layout_hook(layout): | CODE |
| MEDIUM | tests/integration/test_hooks.py | 265 | def error_hook(error): | CODE |
| MEDIUM | tests/integration/test_hooks.py | 277 | def callback_hook(n_clicks): | CODE |
| LOW | …ents/tests/integration/misc/test_popover_visibility.py | 35 | except Exception as e: | CODE |
| LOW | …e-components/tests/integration/calendar/test_portal.py | 44 | except Exception as e: | CODE |
| LOW | …components/tests/integration/graph/test_graph_varia.py | 601 | except Exception as e: | CODE |
| LOW | dash/_callback.py | 778 | except Exception as err: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/_callback.py | 851 | except Exception as err: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/dash.py | 849 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/dash.py | 2461 | except Exception as e: | CODE |
| LOW | dash/_jupyter.py | 415 | except Exception as error: | CODE |
| LOW | dash/_jupyter.py | 469 | except Exception as final_error: # pylint: disable=broad-except | CODE |
| MEDIUM | dash/_jupyter.py | 410 | def run(): | CODE |
| LOW | dash/_utils.py | 246 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | dash/backends/_fastapi.py | 154 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/_fastapi.py | 215 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/_fastapi.py | 251 | except Exception as e: # pylint: disable=W0718 | CODE |
| LOW | dash/backends/_fastapi.py | 346 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/_fastapi.py | 675 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | dash/backends/_fastapi.py | 333 | def _setup_catchall(self): | CODE |
| LOW | dash/backends/_quart.py | 489 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/_quart.py | 687 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/ws.py | 350 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/ws.py | 378 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/ws.py | 482 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/ws.py | 580 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/backends/ws.py | 625 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | dash/backends/ws.py | 559 | def execute() -> dict: | CODE |
| LOW | dash/mcp/_server.py | 305 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| LOW | …h/mcp/primitives/tools/tool_decorated_mcp_functions.py | 28 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | …h/mcp/primitives/tools/tool_decorated_mcp_functions.py | 67 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | …h/mcp/primitives/tools/tool_decorated_mcp_functions.py | 141 | except Exception as exc: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/mcp/primitives/tools/callback_utils.py | 36 | except Exception as err: | CODE |
| LOW | dash/mcp/primitives/tools/callback_adapter.py | 205 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/mcp/primitives/tools/callback_adapter.py | 360 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | …ools/input_schemas/schema_callback_type_annotations.py | 42 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/testing/application_runners.py | 188 | except Exception as error: | CODE |
| LOW | dash/testing/application_runners.py | 210 | except Exception as err: # pylint: disable=broad-except | CODE |
| LOW | dash/testing/application_runners.py | 280 | except Exception as error: | CODE |
| LOW | dash/testing/browser.py | 206 | except Exception as err: # pylint: disable=broad-exception-caught | CODE |
| LOW | dash/testing/browser.py | 288 | except Exception as err: | CODE |
| LOW | dash/testing/browser.py | 533 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | dash/testing/browser.py | 91 | def __exit__(self, exc_type, exc_val, traceback): | CODE |
| LOW | dash/testing/plugin.py | 132 | except Exception as e: # pylint: disable=broad-except | CODE |
| LOW | dash/background_callback/managers/diskcache_manager.py | 164 | except Exception as e: | CODE |
| LOW | dash/background_callback/managers/diskcache_manager.py | 245 | except Exception as err: # pylint: disable=broad-except | CODE |
| LOW | dash/background_callback/managers/diskcache_manager.py | 281 | except Exception as err: # pylint: disable=broad-except | CODE |
| LOW | dash/background_callback/managers/diskcache_manager.py | 298 | except Exception as err: # pylint: disable=broad-except | CODE |
| LOW | dash/background_callback/managers/celery_manager.py | 187 | except Exception as err: # pylint: disable=broad-except | CODE |
| LOW | dash/background_callback/managers/celery_manager.py | 233 | except Exception as err: # pylint: disable=broad-except | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/library/fixtures.py | 26 | CODE | |
| LOW | tests/backend_tests/test_custom_backend.py | 13 | CODE | |
| LOW | tests/compliance/test_typing.py | 68 | CODE | |
| LOW | tests/background_callback/utils.py | 77 | CODE | |
| LOW | tests/async_tests/utils.py | 77 | CODE | |
| LOW | components/dash-table/tests/selenium/test_column.py | 220 | CODE | |
| LOW | components/dash-table/tests/selenium/test_filter2.py | 12 | CODE | |
| LOW | components/dash-table/tests/selenium/test_formatting.py | 9 | CODE | |
| LOW | dash/_callback.py | 523 | CODE | |
| LOW | dash/_callback.py | 582 | CODE | |
| LOW | dash/_grouping.py | 20 | CODE | |
| LOW | dash/dash.py | 1105 | CODE | |
| LOW | dash/dash.py | 1541 | CODE | |
| LOW | dash/dash.py | 1619 | CODE | |
| LOW | dash/dash.py | 1708 | CODE | |
| LOW | dash/dash.py | 1997 | CODE | |
| LOW | dash/dash.py | 2235 | CODE | |
| LOW | dash/dash.py | 2287 | CODE | |
| LOW | dash/_layout_utils.py | 193 | CODE | |
| LOW | dash/_layout_utils.py | 216 | CODE | |
| LOW | dash/_watch.py | 7 | CODE | |
| LOW | dash/_watch.py | 11 | CODE | |
| LOW | dash/_validate.py | 215 | CODE | |
| LOW | dash/_validate.py | 613 | CODE | |
| LOW | dash/_validate.py | 274 | CODE | |
| LOW | dash/resources.py | 50 | CODE | |
| LOW | dash/_jupyter.py | 490 | CODE | |
| LOW | dash/dependencies.py | 88 | CODE | |
| LOW | dash/_utils.py | 145 | CODE | |
| LOW | dash/_pages.py | 416 | CODE | |
| LOW | dash/development/_collect_nodes.py | 9 | CODE | |
| LOW | dash/development/_collect_nodes.py | 22 | CODE | |
| LOW | dash/development/_collect_nodes.py | 35 | CODE | |
| LOW | dash/development/_collect_nodes.py | 49 | CODE | |
| LOW | dash/development/base_component.py | 158 | CODE | |
| LOW | dash/development/base_component.py | 298 | CODE | |
| LOW | dash/development/base_component.py | 395 | CODE | |
| LOW | dash/development/base_component.py | 430 | CODE | |
| LOW | dash/development/_jl_components_generation.py | 184 | CODE | |
| LOW | dash/development/_r_components_generation.py | 788 | CODE | |
| LOW | dash/development/_py_components_generation.py | 468 | CODE | |
| LOW | dash/development/build_process.py | 110 | CODE | |
| LOW | dash/backends/_fastapi.py | 73 | CODE | |
| LOW | dash/backends/_fastapi.py | 384 | CODE | |
| LOW | dash/backends/_fastapi.py | 623 | CODE | |
| LOW | dash/backends/_fastapi.py | 679 | CODE | |
| LOW | dash/backends/_fastapi.py | 710 | CODE | |
| LOW | dash/backends/_quart.py | 509 | CODE | |
| LOW | dash/backends/_quart.py | 524 | CODE | |
| LOW | dash/backends/_utils.py | 5 | CODE | |
| LOW | dash/mcp/primitives/tools/callback_adapter.py | 433 | CODE | |
| LOW | dash/mcp/primitives/tools/callback_adapter.py | 66 | CODE | |
| LOW | dash/mcp/primitives/tools/callback_adapter.py | 239 | CODE | |
| LOW | dash/mcp/primitives/tools/callback_adapter.py | 311 | CODE | |
| LOW | …sh/mcp/primitives/tools/callback_adapter_collection.py | 156 | CODE | |
| LOW | dash/testing/application_runners.py | 158 | CODE | |
| LOW | dash/testing/application_runners.py | 388 | CODE | |
| LOW | dash/testing/application_runners.py | 486 | CODE | |
| LOW | dash/testing/plugin.py | 119 | CODE | |
| LOW | dash/background_callback/managers/diskcache_manager.py | 63 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | CHANGELOG.md | 1063 | - [#2009](https://github.com/plotly/dash/pull/2009) Add support for Promises within Client-side callbacks as requested i | CODE |
| HIGH | CHANGELOG.md | 1063 | - [#2009](https://github.com/plotly/dash/pull/2009) Add support for Promises within Client-side callbacks as requested i | CODE |
| HIGH | CHANGELOG.md | 1191 | - [#1883](https://github.com/plotly/dash/pull/1883) in DataTable added `page_current` to `persisted_props` as requested | CODE |
| HIGH | CHANGELOG.md | 1191 | - [#1883](https://github.com/plotly/dash/pull/1883) in DataTable added `page_current` to `persisted_props` as requested | CODE |
| HIGH | …ore-components/tests/unit/computeSliderMarkers.test.ts | 4 | * File is largely generated by Claude | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …sh-html-components/vignettes/dash-html-components.html | 20 | return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,t | CODE |
| CRITICAL | components/dash-table/tests/selenium/conftest.py | 388 | self.mixin.driver.switch_to.active_element.send_keys(value + Keys.ENTER) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ash-core-components/tests/dash_core_components_page.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | dash/__init__.py | 62 | __all__ = [ | CODE |
| LOW | dash/development/update_components.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | dash/development/build_process.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | dash/backends/_fastapi.py | 144 | async def _setup_timing(self, request: Request) -> None: | CODE |
| LOW | dash/backends/__init__.py | 72 | __all__ = [ | CODE |
| LOW | dash/backends/ws.py | 118 | def set_prop_sync(self, component_id: str, prop_name: str, value: Any) -> None: | CODE |
| LOW | dash/backends/ws.py | 137 | async def set_prop(self, component_id: str, prop_name: str, value: Any) -> None: | CODE |
| LOW | dash/mcp/__init__.py | 7 | __all__ = [ | CODE |
| LOW | dash/mcp/_server.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | dash/mcp/tasks/__init__.py | 5 | __all__ = ["create_task", "get_task", "get_task_result", "cancel_task"] | CODE |
| LOW | dash/mcp/types/__init__.py | 42 | __all__ = [ | CODE |
| LOW | dash/mcp/primitives/__init__.py | 11 | __all__ = [ | CODE |
| LOW | …h/mcp/primitives/tools/results/result_plotly_figure.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | dash/testing/application_runners.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | dash/testing/wait.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | dash/testing/browser.py | 35 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/compliance/test_typing.py | 89 | # Check if dash is installed as editable or regular install. | STRING |
| LOW | …ore-components/tests/integration/dropdown/test_a11y.py | 804 | # Check if the given elements are within the visible viewport of the dropdown | COMMENT |
| LOW | …h-core-components/dash_core_components_base/express.py | 19 | # Read the file contents and send it. | COMMENT |
| LOW | …h-core-components/dash_core_components_base/express.py | 84 | # Check if the provided writer is known. | COMMENT |
| LOW | dash/_callback.py | 51 | # Check if the function is a coroutine function | COMMENT |
| LOW | dash/fingerprint.py | 20 | # Check if the resource has a fingerprint | COMMENT |
| LOW | dash/dash.py | 219 | # Check if the function is a coroutine function | STRING |
| LOW | dash/dash.py | 1732 | # Check if any level of current path matches ignore path | COMMENT |
| LOW | dash/backends/_fastapi.py | 389 | # Check if we're running in a thread (e.g., from testing framework) | COMMENT |
| LOW | dash/backends/_fastapi.py | 407 | # Check if the file is outside the current working directory | COMMENT |
| LOW | dash/backends/_quart.py | 273 | # Check if we're running in a non-main thread (e.g., testing context) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/development/metadata_test.py | 137 | CODE | |
| LOW | tests/background_callback/app_ctx_cookies.py | 39 | CODE | |
| LOW | dash/_callback.py | 73 | CODE | |
| LOW | dash/_callback.py | 285 | CODE | |
| LOW | dash/dash.py | 445 | CODE | |
| LOW | dash/dash.py | 1351 | CODE | |
| LOW | dash/dash.py | 1997 | CODE | |
| LOW | dash/dash.py | 2287 | CODE | |
| LOW | dash/_pages.py | 159 | CODE | |
| LOW | dash/development/component_generator.py | 41 | CODE | |
| LOW | dash/development/_py_components_generation.py | 344 | CODE | |
| LOW | dash/testing/browser.py | 42 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/integration/mcp/test_mcp_callback_behavior.py | 267 | dash_duo.wait_for_text_to_equal("#out", "Jane Doe") | CODE |
| LOW | tests/integration/mcp/test_mcp_callback_behavior.py | 281 | assert response["out"]["children"] == "Jane Doe" | CODE |
| LOW | …nents/dash-core-components/src/components/Textarea.tsx | 17 | 'placeholder', | CODE |
| LOW | …mponents/dash-core-components/src/components/Input.tsx | 30 | 'placeholder', | CODE |
| LOW | components/dash-html-components/dash-info.yaml | 1594 | htmlNobr("Lorem ipsum dolor sit amet, | CODE |
| LOW | components/dash-html-components/dash-info.yaml | 1594 | htmlNobr("Lorem ipsum dolor sit amet, | CODE |
| LOW | …nts/dash-html-components/scripts/extract-attributes.js | 26 | 'noValidate', 'nonce', 'open', 'optimum', 'pattern', 'placeholder', 'playsInline', 'poster', | CODE |
| LOW | …ents/dash-html-components/scripts/data/attributes.json | 485 | "placeholder": { | CODE |
| LOW | …ents/dash-html-components/scripts/data/attributes.json | 787 | "placeholder", | CODE |
| LOW | …ents/dash-html-components/scripts/data/attributes.json | 818 | "placeholder", | CODE |
| LOW | components/dash-table/tests/selenium/conftest.py | 394 | .get_attribute("placeholder") | CODE |
| LOW | components/dash-table/tests/selenium/conftest.py | 468 | ).get_attribute("placeholder") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | components/dash-core-components/dash_prop_typing.py | 1 | # This file is automatically loaded on build time to generate types. | COMMENT |
| MEDIUM | components/dash-table/dash_prop_typing.py | 1 | # This file is automatically loaded on build time to generate types. | COMMENT |
| MEDIUM | dash/_callback.py | 942 | # Create a hash from the function, it will be the same always | STRING |
| MEDIUM | dash/background_callback/managers/diskcache_manager.py | 154 | # Create a new event loop for the process | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/pages/sub_dir/custom_pages/__init__.py | 1 | # this directory is used for testing custom values of `pages_folder` param that | COMMENT |
| LOW | tests/unit/pages/custom_pages/__init__.py | 1 | # this directory is used for testing custom values of `pages_folder` param that | COMMENT |
| LOW | tests/async_tests/test_async_callbacks.py | 321 | COMMENT | |
| LOW | components/dash-table/tests/selenium/test_bootstrap.py | 1 | # import dash | COMMENT |
| LOW | components/dash-table/tests/selenium/test_bootstrap.py | 21 | # columns=[ | COMMENT |
| LOW | components/dash-table/tests/selenium/test_bootstrap.py | 41 | # ) | COMMENT |
| LOW | components/dash-table/tests/selenium/test_bootstrap.py | 61 | # test, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | dash/backends/ws.py | 152 | Request current prop value from the client. On the event-loop path (``self._loop`` set, async callbacks) the wa | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | components/dash-table/dash-info.yaml | 19 | # For comprehensive documentation of this package's features, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/integration/callbacks/test_prevent_update.py | 37 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | dash/__init__.py | 2 | # __plotly_dash is for the "make sure you don't have a dash.py" check | COMMENT |