An open source multi-tool for exploring and publishing data
This report presents the forensic synthetic code analysis of simonw/datasette, a Python project with 11,278 GitHub stars. SynthScan v2.0 examined 92,139 lines of code across 278 source files, recording 1554 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 15.6 places this repository in the Moderate AI signal 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 1554 distinct pattern matches across 16 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 |
|---|---|---|---|---|
| LOW | tests/test_column_types.py | 129 | async def test_column_types_table_created(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 139 | async def test_config_loaded_into_internal_db(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 151 | async def test_config_with_type_and_config(tmp_path_factory): | CODE |
| LOW | tests/test_column_types.py | 213 | async def test_get_column_type_missing(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 220 | async def test_set_and_remove_column_type(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 233 | async def test_set_column_type_with_config(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 264 | async def test_set_column_type_api_with_config(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 286 | async def test_clear_column_type_api(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 399 | async def test_set_column_type_api_errors( | CODE |
| LOW | tests/test_column_types.py | 423 | async def test_set_column_type_api_works_for_immutable_database(tmp_path_factory): | CODE |
| LOW | tests/test_column_types.py | 452 | async def test_set_column_type_rejects_incompatible_sqlite_type(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 459 | async def test_set_column_type_allows_varchar_for_text_only_type(tmp_path_factory): | CODE |
| LOW | tests/test_column_types.py | 481 | async def test_builtin_column_types_registered(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 492 | async def test_column_type_class_attributes(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 510 | def test_sqlite_type_from_declared_type(): | CODE |
| LOW | tests/test_column_types.py | 545 | async def test_display_columns_include_column_type(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 596 | async def test_email_validation_on_insert(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 609 | async def test_email_validation_passes_valid(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 621 | async def test_url_validation_on_insert(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 634 | async def test_json_validation_on_insert(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 647 | async def test_validation_on_update(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 660 | async def test_validation_allows_null(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 672 | async def test_validation_allows_empty_string(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 687 | async def test_column_type_base_defaults(): | CODE |
| LOW | tests/test_column_types.py | 703 | async def test_render_cell_extra_with_column_types(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 717 | async def test_duplicate_column_type_name_raises_error(): | CODE |
| LOW | tests/test_column_types.py | 744 | async def test_row_endpoint_render_cell_with_column_types(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 758 | async def test_transform_value_in_json_output(tmp_path_factory): | CODE |
| LOW | tests/test_column_types.py | 810 | async def test_column_type_render_cell_has_priority_over_plugins(tmp_path_factory): | CODE |
| LOW | tests/test_column_types.py | 889 | async def test_row_detail_page_html_rendering(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 905 | async def test_html_table_page_rendering(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 916 | async def test_set_column_type_ui_data_hidden_without_permission(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 924 | async def test_set_column_type_ui_data_includes_applicable_types( | CODE |
| LOW | tests/test_column_types.py | 963 | async def test_validation_on_upsert(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 978 | async def test_validation_on_upsert_passes_valid(ds_ct): | CODE |
| LOW | tests/test_column_types.py | 995 | async def test_unknown_type_warning_logged(tmp_path_factory, caplog): | CODE |
| LOW | tests/test_column_types.py | 1021 | async def test_incompatible_sqlite_type_warning_logged(tmp_path_factory, caplog): | CODE |
| LOW | tests/test_column_types.py | 1048 | async def test_config_overwrites_on_restart(tmp_path_factory): | CODE |
| LOW | tests/test_column_types.py | 1086 | async def test_no_column_types_in_config(tmp_path_factory): | CODE |
| LOW⚡ | tests/test_table_api.py | 122 | async def test_html_only_extras_are_not_available_via_json(ds_client, extra): | CODE |
| LOW⚡ | tests/test_table_api.py | 131 | async def test_html_only_extras_are_not_advertised(ds_client): | CODE |
| LOW⚡ | tests/test_table_api.py | 138 | def test_query_extra_private_for_arbitrary_sql(): | CODE |
| LOW⚡ | tests/test_table_api.py | 265 | async def test_table_shape_object_compound_primary_key(ds_client): | CODE |
| LOW⚡ | tests/test_table_api.py | 275 | async def test_table_with_slashes_in_name(ds_client): | CODE |
| LOW⚡ | tests/test_table_api.py | 285 | async def test_table_with_reserved_word_name(ds_client): | CODE |
| LOW | tests/test_table_api.py | 30 | async def test_table_not_exists_json(ds_client): | CODE |
| LOW | tests/test_table_api.py | 52 | async def test_table_shape_arrayfirst(ds_client): | CODE |
| LOW | tests/test_table_api.py | 72 | async def test_query_extras_for_arbitrary_sql(ds_client): | CODE |
| LOW | tests/test_table_api.py | 96 | async def test_query_extras_for_stored_query(ds_client): | CODE |
| LOW | tests/test_table_api.py | 152 | def test_query_extra_query_reports_bound_params(): | CODE |
| LOW | tests/test_table_api.py | 183 | def test_query_extra_query_does_not_echo_querystring(): | CODE |
| LOW | tests/test_table_api.py | 192 | def test_query_extra_private_false_when_sql_is_public(): | CODE |
| LOW | tests/test_table_api.py | 226 | async def test_table_shape_array_nl(ds_client): | CODE |
| LOW | tests/test_table_api.py | 320 | async def test_paginate_tables_and_views( | CODE |
| LOW | tests/test_table_api.py | 367 | async def test_paginate_compound_keys(ds_client): | CODE |
| LOW | tests/test_table_api.py | 388 | async def test_paginate_compound_keys_with_extra_filters(ds_client): | CODE |
| LOW | tests/test_table_api.py | 464 | async def test_sortable_and_filtered(ds_client): | CODE |
| LOW | tests/test_table_api.py | 483 | async def test_sortable_argument_errors(ds_client): | CODE |
| LOW | tests/test_table_api.py | 497 | async def test_sortable_columns_metadata(ds_client): | CODE |
| LOW | tests/test_table_api.py | 630 | async def test_searchable_invalid_column(ds_client): | CODE |
| 1204 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_table_api.py | 1324 | '{"rowid": 3, "data": null}' | CODE |
| HIGH | tests/test_queries.py | 1794 | assert "window.location.href = url.toString();" not in response.text | STRING |
| HIGH | tests/test_table_html.py | 1175 | name text not null, | CODE |
| HIGH | tests/test_table_html.py | 1330 | name text not null, | CODE |
| HIGH | tests/test_write_wrapper.py | 363 | await db.execute_write("insert into groups (id, current) values (1, null)") | CODE |
| HIGH | tests/test_api_write.py | 1320 | "(1, 'one', 1.5, 1), (2, 'two', 999.5, 2), (3, null, null, null)" | STRING |
| HIGH | tests/test_playwright.py | 113 | title text not null, | CODE |
| HIGH | tests/test_playwright.py | 125 | name text not null, | CODE |
| HIGH | tests/test_playwright.py | 130 | title text not null, | CODE |
| HIGH | tests/test_playwright.py | 280 | if (!context.columnType || context.columnType.type !== "asset") { | CODE |
| HIGH | tests/test_playwright.py | 1014 | window.__discardConfirmMessages.push(message); | CODE |
| HIGH | tests/test_playwright.py | 1347 | "node => node.hidden && node.disabled" | CODE |
| HIGH | datasette/app.py | 759 | placeholders = "(?, null, ?, ?)" | CODE |
| HIGH⚡ | datasette/fixtures.py | 234 | ("2019-01-14 08:00:00", 1, 1, 'CA', 1, 'SOMA', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 235 | ("2019-01-14 08:00:00", 1, 1, 'CA', 1, 'Tenderloin', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 236 | ("2019-01-15 08:00:00", 1, 1, 'CA', 1, 'Bernal Heights', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 237 | ("2019-01-15 08:00:00", 1, 1, 'CA', 1, 'Hayes Valley', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 238 | ("2019-01-15 08:00:00", 1, 1, 'CA', 2, 'Hollywood', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 239 | ("2019-01-15 08:00:00", 1, 1, 'CA', 2, 'Downtown', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 240 | ("2019-01-16 08:00:00", 1, 1, 'CA', 2, 'Los Feliz', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 241 | ("2019-01-16 08:00:00", 1, 1, 'CA', 2, 'Koreatown', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 242 | ("2019-01-16 08:00:00", 1, 1, 'MI', 3, 'Downtown', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 243 | ("2019-01-17 08:00:00", 1, 1, 'MI', 3, 'Greektown', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 244 | ("2019-01-17 08:00:00", 1, 1, 'MI', 3, 'Corktown', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 245 | ("2019-01-17 08:00:00", 1, 1, 'MI', 3, 'Mexicantown', '[]', '[]', null, null), | STRING |
| HIGH⚡ | datasette/fixtures.py | 246 | ("2019-01-17 08:00:00", 2, 0, 'MC', 4, 'Arcadia Planitia', '[]', '[]', null, null) | STRING |
| HIGH | datasette/fixtures.py | 272 | 3, "Burlingame Museum of PEZ Memorabilia", "214 California Drive, Burlingame, CA 94010", null, | STRING |
| HIGH | datasette/fixtures.py | 321 | INSERT INTO foreign_key_references VALUES (2, null, null, null, null, null); | STRING |
| HIGH | datasette/fixtures.py | 364 | ("insert into binary_data (data) values (null);", []), | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_auth.py | 275 | CODE | |
| LOW | tests/test_docs.py | 174 | CODE | |
| LOW | tests/test_html.py | 922 | CODE | |
| LOW | tests/test_queries.py | 3397 | CODE | |
| LOW | tests/test_multipart.py | 997 | CODE | |
| LOW | tests/test_multipart.py | 1057 | CODE | |
| LOW | tests/test_permissions.py | 936 | CODE | |
| LOW | tests/fixtures.py | 106 | CODE | |
| LOW | tests/plugins/my_plugin.py | 556 | CODE | |
| LOW | docs/json_api_doc.py | 8 | CODE | |
| LOW | docs/json_api_doc.py | 85 | CODE | |
| LOW | datasette/plugins.py | 97 | CODE | |
| LOW | datasette/stored_queries.py | 241 | CODE | |
| LOW | datasette/renderer.py | 14 | CODE | |
| LOW | datasette/renderer.py | 32 | CODE | |
| LOW | datasette/database.py | 441 | CODE | |
| LOW | datasette/database.py | 588 | CODE | |
| LOW | datasette/database.py | 919 | CODE | |
| LOW | datasette/cli.py | 71 | CODE | |
| LOW | datasette/app.py | 399 | CODE | |
| LOW | datasette/app.py | 638 | CODE | |
| LOW | datasette/app.py | 785 | CODE | |
| LOW | datasette/app.py | 1350 | CODE | |
| LOW | datasette/app.py | 2968 | CODE | |
| LOW | datasette/facets.py | 14 | CODE | |
| LOW | datasette/facets.py | 219 | CODE | |
| LOW | datasette/facets.py | 310 | CODE | |
| LOW | datasette/facets.py | 380 | CODE | |
| LOW | datasette/facets.py | 513 | CODE | |
| LOW | datasette/tracer.py | 89 | CODE | |
| LOW | datasette/tracer.py | 100 | CODE | |
| LOW | datasette/filters.py | 43 | CODE | |
| LOW | datasette/filters.py | 45 | CODE | |
| LOW | datasette/filters.py | 411 | CODE | |
| LOW | datasette/default_permissions/config.py | 101 | CODE | |
| LOW | datasette/default_permissions/config.py | 199 | CODE | |
| LOW | datasette/utils/multipart.py | 192 | CODE | |
| LOW | datasette/utils/multipart.py | 639 | CODE | |
| LOW | datasette/utils/multipart.py | 367 | CODE | |
| LOW | datasette/utils/asgi.py | 297 | CODE | |
| LOW | datasette/utils/actions_sql.py | 500 | CODE | |
| LOW | datasette/utils/__init__.py | 1207 | CODE | |
| LOW | datasette/utils/__init__.py | 1540 | CODE | |
| LOW | datasette/utils/__init__.py | 1588 | CODE | |
| LOW | datasette/utils/__init__.py | 1268 | CODE | |
| LOW | datasette/utils/__init__.py | 1549 | CODE | |
| LOW | datasette/utils/shutil_backport.py | 12 | CODE | |
| LOW | datasette/utils/sql_analysis.py | 198 | CODE | |
| LOW | datasette/publish/heroku.py | 20 | CODE | |
| LOW | datasette/publish/heroku.py | 38 | CODE | |
| LOW | datasette/publish/cloudrun.py | 16 | CODE | |
| LOW | datasette/publish/cloudrun.py | 86 | CODE | |
| LOW | datasette/views/index.py | 26 | CODE | |
| LOW | datasette/views/query_helpers.py | 247 | CODE | |
| LOW | datasette/views/database.py | 1191 | CODE | |
| LOW | datasette/views/database.py | 575 | CODE | |
| LOW | datasette/views/database.py | 704 | CODE | |
| LOW | datasette/views/table_extras.py | 223 | CODE | |
| LOW | datasette/views/table_extras.py | 663 | CODE | |
| LOW | datasette/views/table_extras.py | 1024 | CODE | |
| 19 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/conftest.py | 301 | CODE | |
| LOW | tests/test_docs.py | 6 | CODE | |
| LOW | datasette/stored_queries.py | 1 | CODE | |
| LOW | datasette/csrf.py | 10 | CODE | |
| LOW | datasette/_pytest_plugin.py | 15 | CODE | |
| LOW | datasette/jump.py | 1 | CODE | |
| LOW | datasette/__init__.py | 1 | CODE | |
| LOW | datasette/__init__.py | 2 | CODE | |
| LOW | datasette/__init__.py | 2 | CODE | |
| LOW | datasette/__init__.py | 3 | CODE | |
| LOW | datasette/__init__.py | 4 | CODE | |
| LOW | datasette/__init__.py | 4 | CODE | |
| LOW | datasette/__init__.py | 4 | CODE | |
| LOW | datasette/__init__.py | 5 | CODE | |
| LOW | datasette/__init__.py | 5 | CODE | |
| LOW | datasette/__init__.py | 5 | CODE | |
| LOW | datasette/__init__.py | 5 | CODE | |
| LOW | datasette/__init__.py | 5 | CODE | |
| LOW | datasette/__init__.py | 12 | CODE | |
| LOW | datasette/__init__.py | 13 | CODE | |
| LOW | datasette/__init__.py | 14 | CODE | |
| LOW | datasette/__init__.py | 15 | CODE | |
| LOW | datasette/tokens.py | 9 | CODE | |
| LOW | datasette/tokens.py | 18 | CODE | |
| LOW | datasette/app.py | 1 | CODE | |
| LOW | datasette/app.py | 9 | CODE | |
| LOW | datasette/write_sql.py | 1 | CODE | |
| LOW | datasette/default_permissions/config.py | 7 | CODE | |
| LOW | datasette/default_permissions/config.py | 12 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 18 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 21 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 21 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 21 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 26 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 27 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 28 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 28 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 28 | CODE | |
| LOW | datasette/default_permissions/__init__.py | 28 | CODE | |
| LOW | datasette/default_permissions/tokens.py | 8 | CODE | |
| LOW | datasette/default_permissions/tokens.py | 13 | CODE | |
| LOW | datasette/default_permissions/defaults.py | 7 | CODE | |
| LOW | datasette/default_permissions/defaults.py | 12 | CODE | |
| LOW | datasette/default_permissions/root.py | 7 | CODE | |
| 9 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_write_wrapper.py | 113 | def wrapper(conn): | CODE |
| LOW | tests/test_write_wrapper.py | 116 | except Exception as e: | CODE |
| LOW | tests/test_api_write.py | 1422 | except Exception: | STRING |
| LOW | datasette/csrf.py | 166 | except Exception: | CODE |
| LOW | datasette/_pytest_plugin.py | 92 | except Exception as e: | CODE |
| LOW | datasette/database.py | 203 | except Exception: | CODE |
| LOW | datasette/database.py | 209 | except Exception: | CODE |
| LOW | datasette/database.py | 221 | except Exception: | CODE |
| LOW | datasette/database.py | 227 | except Exception: | CODE |
| LOW | datasette/database.py | 373 | except Exception: | CODE |
| LOW | datasette/database.py | 449 | except Exception as e: | CODE |
| LOW | datasette/database.py | 457 | except Exception: | CODE |
| LOW | datasette/database.py | 476 | except Exception as e: | CODE |
| LOW | datasette/database.py | 488 | except Exception as e: | CODE |
| LOW | datasette/database.py | 837 | except Exception as e: | STRING |
| MEDIUM | datasette/database.py | 370 | def _dispatch_events_after_write(): | CODE |
| LOW | datasette/app.py | 981 | except Exception as e: | CODE |
| LOW | datasette/app.py | 987 | except Exception as e: | CODE |
| LOW | datasette/app.py | 2956 | except Exception as exception: | CODE |
| LOW | datasette/app.py | 2207 | except Exception: | STRING |
| LOW | datasette/app.py | 2216 | except Exception as e: | STRING |
| LOW | datasette/tracer.py | 53 | except Exception as ex: | CODE |
| LOW | datasette/utils/multipart.py | 89 | except Exception: | CODE |
| LOW | datasette/utils/multipart.py | 166 | except Exception: | CODE |
| LOW | datasette/utils/multipart.py | 175 | except Exception: | CODE |
| LOW | datasette/utils/multipart.py | 241 | except Exception: | CODE |
| LOW | datasette/utils/multipart.py | 457 | except Exception: | CODE |
| MEDIUM | datasette/utils/multipart.py | 86 | def __del__(self): | CODE |
| LOW | datasette/utils/__init__.py | 744 | except Exception: | STRING |
| LOW | datasette/views/database.py | 667 | except Exception as ex: | CODE |
| LOW | datasette/views/database.py | 682 | except Exception as ex: | CODE |
| LOW | datasette/views/table.py | 1173 | except Exception as e: | CODE |
| MEDIUM | datasette/views/table.py | 1038 | def post(self, request, upsert=False): | CODE |
| MEDIUM | datasette/views/table_create_alter.py | 1029 | def get(self, request): | CODE |
| LOW | datasette/views/table_create_alter.py | 928 | except Exception as e: | STRING |
| LOW | datasette/views/table_create_alter.py | 1332 | except Exception as e: | STRING |
| LOW | datasette/views/row.py | 756 | except Exception as e: | STRING |
| LOW | datasette/views/row.py | 839 | except Exception as e: | STRING |
| LOW | datasette/views/special.py | 423 | except Exception: | CODE |
| LOW | datasette/views/base.py | 328 | except Exception as ex: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test-in-pyodide-with-shot-scraper.sh | 13 | # Create a blank index page | COMMENT |
| MEDIUM | tests/test_schema_endpoints.py | 29 | # Create a database with restricted access (requires root permission) | COMMENT |
| MEDIUM | tests/test_schema_endpoints.py | 35 | # Create an empty database | COMMENT |
| MEDIUM⚡ | tests/test_plugins.py | 1668 | # Create a token using the hardcoded handler (first registered from plugins dir) | STRING |
| MEDIUM⚡ | tests/test_plugins.py | 1677 | # Create a token by explicitly requesting the hardcoded handler by name | STRING |
| MEDIUM⚡ | tests/test_plugins.py | 1683 | # Create a token by explicitly requesting the signed handler by name | STRING |
| MEDIUM | tests/test_plugins.py | 1780 | # Define a test plugin that registers these actions | STRING |
| MEDIUM | tests/test_multipart.py | 393 | # Create a body larger than the in-memory threshold (1MB) | COMMENT |
| MEDIUM | tests/test_allowed_resources.py | 345 | # Create a database with 105 tables | COMMENT |
| MEDIUM | tests/test_internal_db.py | 212 | # Create a data database file | STRING |
| MEDIUM | docs/conf.py | 7 | # This file is execfile()d with the current directory set to its | COMMENT |
| MEDIUM | datasette/publish/heroku.py | 140 | # Create a new app | COMMENT |
| MEDIUM | demos/plugins/example_js_manager_plugins.py | 7 | # Create a set with view names that qualify for this JS, since plugins won't do anything on other pages | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_allowed_many.py | 72 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_allowed_many.py | 74 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_allowed_many.py | 205 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_allowed_many.py | 207 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_allowed_many.py | 582 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_allowed_many.py | 584 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | datasette/utils/permissions.py | 86 | # ----------------------------- | COMMENT |
| MEDIUM | datasette/utils/permissions.py | 88 | # ----------------------------- | COMMENT |
| MEDIUM⚡ | datasette/utils/permissions.py | 133 | # ----------------------------------------------- | STRING |
| MEDIUM⚡ | datasette/utils/permissions.py | 135 | # ----------------------------------------------- | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_auth.py | 364 | # Set root_enabled to simulate --root flag | COMMENT |
| LOW | tests/test_docs.py | 189 | # Check if next line is entirely made of a single underline character | COMMENT |
| LOW | tests/test_docs.py | 201 | # Check if this is an overline+underline style heading | COMMENT |
| LOW | tests/plugins/my_plugin.py | 525 | # Check if this is a global action (no resource_class specified) | STRING |
| LOW | .github/workflows/stable-docs.yml | 64 | # Check if the list of files is non-empty | COMMENT |
| LOW | datasette/app.py | 1709 | # Check if actor can see it | COMMENT |
| LOW | datasette/app.py | 1713 | # Check if anonymous user can see it (for "private" flag) | COMMENT |
| LOW | datasette/app.py | 1860 | # Check if truncated (got more than limit rows) | STRING |
| LOW | datasette/permissions.py | 114 | # Check if our parent has a parent - that would create 3 levels | COMMENT |
| LOW | datasette/utils/permissions.py | 28 | # Check if we should skip permission checks BEFORE calling hooks | COMMENT |
| LOW | datasette/views/index.py | 82 | # Check if table is in allowed set | COMMENT |
| LOW | datasette/views/special.py | 316 | # Check if user has permissions-debug (to show sensitive fields) | COMMENT |
| LOW | datasette/views/special.py | 321 | # Check if this is a request for JSON (has .json extension) | COMMENT |
| LOW | datasette/views/special.py | 487 | # Check if this is a request for JSON (has .json extension) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/fixtures.py | 106 | CODE | |
| LOW | datasette/stored_queries.py | 163 | CODE | |
| LOW | datasette/stored_queries.py | 241 | CODE | |
| LOW | datasette/stored_queries.py | 357 | CODE | |
| LOW | datasette/stored_queries.py | 427 | CODE | |
| LOW | datasette/app.py | 399 | CODE | |
| LOW | datasette/app.py | 1125 | CODE | |
| LOW | datasette/app.py | 1173 | CODE | |
| LOW | datasette/app.py | 1229 | CODE | |
| LOW | datasette/app.py | 1253 | CODE | |
| LOW | datasette/app.py | 1652 | CODE | |
| LOW | datasette/utils/multipart.py | 639 | CODE | |
| LOW | datasette/utils/multipart.py | 303 | CODE | |
| LOW | datasette/utils/asgi.py | 202 | CODE | |
| LOW | datasette/utils/asgi.py | 520 | CODE | |
| LOW | datasette/utils/testing.py | 83 | CODE | |
| LOW | datasette/utils/testing.py | 114 | CODE | |
| LOW | datasette/utils/testing.py | 138 | CODE | |
| LOW | datasette/views/execute_write.py | 240 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | datasette/app.py | 1662 | Create a Resource instance for the given action with parent/child values. Looks up the action's resour | STRING |
| HIGH | datasette/utils/asgi.py | 216 | Parse form data from the request body. Supports both application/x-www-form-urlencoded and multipart/f | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | datasette/static/cm-editor-6.0.1.bundle.js | 1 | var cm=function(t){"use strict";class e{constructor(){}lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid pos | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_internals_database.py | 776 | # via dependency injection. | COMMENT |
| MEDIUM | datasette/database.py | 389 | # switching to keyword dependency injection when the callback | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_playwright.py | 791 | dialog.locator(".table-alter-column-name").first.get_attribute("placeholder") | CODE |
| LOW | tests/test_playwright.py | 942 | assert table_name.get_attribute("placeholder") == "table name" | CODE |
| LOW | tests/test_playwright.py | 429 | dialog.locator(".table-create-column-name").nth(0).get_attribute("placeholder") | STRING |
| LOW | datasette/static/sql-formatter-2.3.3.min.js | 4 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.am | CODE |
| LOW | datasette/templates/create_token.html | 95 | expireDuration.setAttribute("placeholder", expireType.value.replace("Expires after X ", "")); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/conf.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | docs/conf.py | 81 | # |version| and |release|, also used in various other places throughout the | COMMENT |
| LOW | docs/conf.py | 141 | # -- Options for LaTeX output --------------------------------------------- | COMMENT |
| LOW | datasette/static/datasette-manager.js | 221 | // Future API ideas | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | datasette/fixtures.py | 7 | __all__ = [ | CODE |
| LOW | datasette/views/special.py | 22 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | datasette/utils/permissions.py | 111 | # No namespacing - just use plugin params as-is | COMMENT |