The source code that powers readthedocs.org
This report presents the forensic synthetic code analysis of readthedocs/readthedocs.org, a Python project with 8,372 GitHub stars. SynthScan v2.0 examined 138,027 lines of code across 836 source files, recording 2120 pattern matches distributed across 19 syntactic categories. The overall adjusted score of 16.7 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).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
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 2120 distinct pattern matches across 19 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 | readthedocs/organizations/signals.py | 33 | def remove_organization_completely(sender, instance, using, **kwargs): | CODE |
| LOW | readthedocs/organizations/signals.py | 70 | def mark_organization_assets_not_cleaned(sender, instance, created, **kwargs): | CODE |
| LOW | readthedocs/organizations/querysets.py | 47 | def subscription_trial_plan_ended(self): | CODE |
| LOW | readthedocs/organizations/models.py | 36 | def _upload_organization_avatar_to(instance, filename): | CODE |
| LOW | readthedocs/organizations/models.py | 56 | def _get_user_content_storage(): | CODE |
| LOW | readthedocs/organizations/filters.py | 37 | def get_organization_queryset(self): | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 183 | def test_create_organization_with_empty_slug(self): | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 194 | def test_create_organization_with_invalid_unicode_slug(self): | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 206 | def test_create_organization_with_big_name(self): | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 215 | def test_create_organization_with_existent_slug(self): | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 226 | def test_create_organization_with_nonexistent_slug(self): | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 237 | def test_create_organization_with_invalid_slug(self): | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 247 | def test_create_organization_with_dns_invalid_slug(self): | CODE |
| LOW | readthedocs/organizations/tests/test_forms.py | 40 | def test_add_team_member_by_name(self): | CODE |
| LOW | readthedocs/organizations/tests/test_forms.py | 50 | def test_add_duplicate_member_by_username(self): | CODE |
| LOW | readthedocs/organizations/tests/test_forms.py | 63 | def test_add_team_member_by_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_forms.py | 83 | def test_add_team_invite_unverified_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_forms.py | 103 | def test_add_fresh_member_by_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_forms.py | 123 | def test_add_team_member_with_username_matching_other_user_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_forms.py | 143 | def test_add_team_member_with_username_matching_unverified_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_forms.py | 159 | def test_add_duplicate_invite_by_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 204 | def test_member_add_regression(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 211 | def test_member_delete_regression(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 229 | def test_team_add_slug_conflict(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 261 | def test_team_delete_regression(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 300 | def test_add_member_by_email_on_org_with_members(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 330 | def test_add_duplicate_member_by_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 356 | def test_add_existing_user_by_username(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 372 | def test_invite_already_invited_member_by_username(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 398 | def test_invite_already_existing_member_by_username(self): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 415 | def test_invite_user_from_the_same_org(self, send_email): | CODE |
| LOW | readthedocs/organizations/tests/test_orgs.py | 452 | def test_invite_myuself_to_team(self, send_email): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 96 | def test_update_avatar_invalid_dimensions(self): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 119 | def test_update_avatar_invalid_image(self): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 142 | def test_update_avatar_invalid_extension(self): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 197 | def test_delete_blocked_for_banned_owner(self): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 210 | def test_delete_blocked_for_spam_project_score(self, get_spam_score): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 270 | def test_add_owner_with_username_matching_other_user_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 288 | def test_add_owner_with_username_matching_unverified_email(self): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 560 | def test_choose_organization_edit(self): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 596 | def test_unspecified_slug_redirects_to_organization_edit(self): | CODE |
| LOW | readthedocs/organizations/tests/test_views.py | 617 | def test_choose_organization_edit(self): | CODE |
| LOW | readthedocs/organizations/tests/test_querysets.py | 37 | def test_organizations_with_trial_subscription_plan_ended(self): | CODE |
| LOW | readthedocs/organizations/tests/test_querysets.py | 79 | def test_organizations_to_be_disabled(self): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 135 | def test_filtered_queryset_choice(self, user, organization): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 150 | def test_filtered_queryset_invalid_choice(self, user, organization): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 173 | def test_organization_filter_choices(self, user, organization): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 221 | def test_filtered_queryset_project_choice(self, user, organization, project): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 245 | def test_filtered_queryset_project_invalid_choice( | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 276 | def test_filtered_queryset_team_choice( | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 302 | def test_filtered_queryset_team_invalid_choice(self, user, organization, project): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 329 | def test_project_filter_choices(self, user, organization, project): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 402 | def test_filtered_queryset_team_choice(self, user, organization, team): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 426 | def test_filtered_queryset_team_invalid_choice(self, user, organization, team): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 498 | def test_filtered_queryset_team_choice(self, user, organization, team, users): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 524 | def test_filtered_queryset_access_choice(self, user, organization, access, users): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 548 | def test_filtered_queryset_team_invalid_choice(self, user, organization): | CODE |
| LOW | readthedocs/organizations/tests/test_filters.py | 588 | def test_access_filter_choices(self, user, organization): | CODE |
| LOW | readthedocs/organizations/tests/test_access.py | 64 | def test_organization_details(self): | CODE |
| LOW | readthedocs/organizations/tests/test_access.py | 68 | def test_organization_owners_regression(self): | CODE |
| 1665 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | readthedocs/organizations/tests/test_orgs.py | 306 | # Create a team member that has no invite. | COMMENT |
| MEDIUM | readthedocs/settings/docker_compose.py | 60 | # Create a Token for an admin User and set it here. | COMMENT |
| MEDIUM | readthedocs/oauth/tests/test_githubapp_webhook.py | 1099 | # Create a webhook automation rule that matches docs files | COMMENT |
| MEDIUM | readthedocs/oauth/tests/test_githubapp_webhook.py | 1144 | # Create a webhook automation rule that matches docs files | COMMENT |
| MEDIUM | readthedocs/oauth/tests/test_githubapp_webhook.py | 1320 | # Create a webhook automation rule for external versions (PRs) | COMMENT |
| MEDIUM | readthedocs/oauth/tests/test_githubapp_webhook.py | 1435 | # Create a webhook automation rule for external versions (PRs) | COMMENT |
| MEDIUM | readthedocs/oauth/tests/test_githubapp_webhook.py | 1744 | # Create a webhook automation rule that only matches PRs (EXTERNAL), | COMMENT |
| MEDIUM | readthedocs/oauth/tests/test_githubapp_webhook.py | 1794 | # Create a webhook automation rule that only matches branches, not PRs. | COMMENT |
| MEDIUM⚡ | readthedocs/core/tests/test_db_utils.py | 270 | # Create a project with 3 versions | COMMENT |
| MEDIUM⚡ | readthedocs/core/tests/test_db_utils.py | 282 | # Create a project with 20 versions | COMMENT |
| MEDIUM⚡ | readthedocs/core/tests/test_db_utils.py | 324 | # Create a project with 5 versions | COMMENT |
| MEDIUM | readthedocs/core/tests/test_db_utils.py | 120 | # Create a project with multiple versions | COMMENT |
| MEDIUM | readthedocs/core/tests/test_db_utils.py | 214 | # Create a project with 3 versions | COMMENT |
| MEDIUM | readthedocs/core/tests/test_db_utils.py | 231 | # Create a project with exactly 5 versions | COMMENT |
| MEDIUM | readthedocs/core/tests/test_db_utils.py | 244 | # Create a project with 10 versions | COMMENT |
| MEDIUM | readthedocs/core/tests/test_db_utils.py | 257 | # Create a project with 25 versions | COMMENT |
| MEDIUM | readthedocs/core/tests/test_db_utils.py | 296 | # Create a project with 5 versions | COMMENT |
| MEDIUM | readthedocs/core/tests/test_db_utils.py | 310 | # Create a project with 10 versions | COMMENT |
| MEDIUM⚡ | readthedocs/vcs_support/base.py | 50 | # Defining a base API, so we'll have unused args | COMMENT |
| MEDIUM | readthedocs/projects/tasks/builds.py | 155 | # Create the object to store all the task-related data | COMMENT |
| MEDIUM | readthedocs/projects/tasks/builds.py | 383 | # Create the object to store all the task-related data | COMMENT |
| MEDIUM | readthedocs/projects/tests/test_build_tasks.py | 285 | # Create the artifact paths, so that `store_build_artifacts` | COMMENT |
| MEDIUM | readthedocs/projects/tests/test_build_tasks.py | 497 | # Create the artifact paths, so it's detected by the builder | COMMENT |
| MEDIUM | readthedocs/projects/tests/test_build_tasks.py | 875 | # Create the artifact paths, so it's detected by the builder | COMMENT |
| MEDIUM | readthedocs/projects/tests/test_build_tasks.py | 1157 | # Create the artifact paths, so it's detected by the builder | COMMENT |
| MEDIUM | readthedocs/projects/tests/test_build_tasks.py | 1421 | # Create the artifact paths, so it's detected by the builder | COMMENT |
| MEDIUM | readthedocs/projects/tests/test_domain_views.py | 199 | # Create the first domain | COMMENT |
| MEDIUM | readthedocs/projects/tests/test_domain_views.py | 207 | # Create the second domain | COMMENT |
| MEDIUM | readthedocs/builds/tests/test_trigger_build.py | 40 | # Create a running build | COMMENT |
| MEDIUM | readthedocs/builds/tests/test_trigger_build.py | 72 | # Create a running build | COMMENT |
| MEDIUM⚡ | readthedocs/builds/tests/test_buildconfig.py | 87 | # Create a build with actual config | COMMENT |
| MEDIUM⚡ | readthedocs/builds/tests/test_buildconfig.py | 92 | # Create a build with same config on the same version | COMMENT |
| MEDIUM | readthedocs/builds/tests/test_tasks.py | 216 | # Create a Build and manually assign the BuildConfig | COMMENT |
| MEDIUM | readthedocs/search/parsers.py | 248 | # Create a copy of the node to avoid manipulating the | COMMENT |
| MEDIUM | readthedocs/search/tests/test_views.py | 48 | # Create a project in bn and add it as a translation | COMMENT |
| MEDIUM | readthedocs/search/tests/test_views.py | 67 | # Create a project in bn and add it as a translation | COMMENT |
| MEDIUM | readthedocs/api/v2/client.py | 36 | # Define a retry mechanism trying to attempt to not fail in the first error. | COMMENT |
| MEDIUM | readthedocs/api/v3/tests/test_filters.py | 61 | # Create a running build. | COMMENT |
| MEDIUM | readthedocs/api/v3/tests/test_filters.py | 78 | # Create a running build to make sure it's excluded. | COMMENT |
| MEDIUM | readthedocs/doc_builder/environments.py | 691 | # Create the checkout path if it doesn't exist to avoid Docker creation | COMMENT |
| MEDIUM | readthedocs/doc_builder/environments.py | 871 | # Create the container in the same network the web container is | COMMENT |
| MEDIUM | readthedocs/doc_builder/director.py | 93 | # Create the VCS repository where all the commands are going to be | COMMENT |
| MEDIUM | readthedocs/doc_builder/director.py | 554 | # Create a symlink for ``root`` user to use the same ``.asdf`` | COMMENT |
| MEDIUM | readthedocs/doc_builder/tests/test_director.py | 27 | # Create a minimal data object that BuildDirector expects | COMMENT |
| MEDIUM | readthedocs/rtd_tests/tests/test_version.py | 16 | # Create a External Version. ie: pull/merge request Version. | COMMENT |
| MEDIUM | readthedocs/rtd_tests/tests/test_oauth.py | 985 | # Create an external version (PR build) that is not built | COMMENT |
| MEDIUM | readthedocs/rtd_tests/tests/test_domains.py | 250 | # Creating the third (3) domain should fail the validation form | COMMENT |
| MEDIUM | readthedocs/rtd_tests/tests/test_api.py | 3493 | # Create a second GitHub integration for the same project with the same secret | COMMENT |
| MEDIUM | readthedocs/rtd_tests/tests/test_project.py | 43 | # Create a External Version. ie: pull/merge request Version. | COMMENT |
| MEDIUM | readthedocs/rtd_tests/tests/test_automation_rules.py | 920 | # Create a tag version | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | readthedocs/organizations/forms.py | 6 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | readthedocs/organizations/templatetags/organizations.py | 5 | from django.core.exceptions import FieldError | CODE |
| CRITICAL | readthedocs/domains/validators.py | 2 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | readthedocs/oauth/tests/test_models.py | 1 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | readthedocs/projects/validators.py | 7 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | readthedocs/projects/tasks/builds.py | 346 | response = self.data.api_client.build.concurrent.get( | CODE |
| CRITICAL | readthedocs/projects/tasks/utils.py | 11 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | readthedocs/projects/tests/test_validators.py | 2 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | readthedocs/projects/tests/test_models.py | 2 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL⚡ | readthedocs/storage/tests/test_s3_storage.py | 22 | mock_bucket.objects.filter.return_value.delete.assert_called_once() | CODE |
| CRITICAL⚡ | readthedocs/storage/tests/test_s3_storage.py | 31 | mock_bucket.objects.filter.return_value.delete.assert_called_once() | CODE |
| CRITICAL | readthedocs/redirects/validators.py | 2 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | readthedocs/doc_builder/director.py | 575 | for tool, version in self.data.config.build.tools.items(): | CODE |
| CRITICAL | media/javascript/jquery/jquery-2.0.3.min.js | 23 | })}},k.pseudos.nth=k.pseudos.eq;for(T in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})k.pseudos[T]=u(T);for(T in{s | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.override.yml | 1 | # docker-compose.override.yml file to launch a full instance of Read the Docs. | COMMENT |
| LOW | requirements/deploy.txt | 1 | # | COMMENT |
| LOW | requirements/deploy.txt | 21 | # -r requirements/pip.txt | COMMENT |
| LOW | requirements/deploy.txt | 41 | bumpver==2026.1132 | COMMENT |
| LOW | requirements/deploy.txt | 61 | # -r requirements/pip.txt | COMMENT |
| LOW | requirements/deploy.txt | 81 | # -r requirements/pip.txt | COMMENT |
| LOW | requirements/deploy.txt | 101 | # via ipython | COMMENT |
| LOW | requirements/deploy.txt | 121 | # django-formtools | COMMENT |
| LOW | requirements/deploy.txt | 141 | django-csp==3.8 | COMMENT |
| LOW | requirements/deploy.txt | 161 | django-safemigrate==6.0 | COMMENT |
| LOW | requirements/deploy.txt | 181 | # rest-framework-generic-relations | COMMENT |
| LOW | requirements/deploy.txt | 201 | # via | COMMENT |
| LOW | requirements/deploy.txt | 221 | # requests | COMMENT |
| LOW | requirements/deploy.txt | 241 | # -r requirements/pip.txt | COMMENT |
| LOW | requirements/deploy.txt | 261 | # -r requirements/pip.txt | COMMENT |
| LOW | requirements/deploy.txt | 281 | # via | COMMENT |
| LOW | requirements/deploy.txt | 301 | # psycopg | COMMENT |
| LOW | requirements/deploy.txt | 321 | # ipython | COMMENT |
| LOW | requirements/deploy.txt | 341 | # botocore | COMMENT |
| LOW | requirements/deploy.txt | 361 | # via | COMMENT |
| LOW | requirements/deploy.txt | 381 | # via -r requirements/pip.txt | COMMENT |
| LOW | requirements/deploy.txt | 401 | # via | COMMENT |
| LOW | requirements/deploy.txt | 421 | structlog-sentry==2.2.1 | COMMENT |
| LOW | requirements/deploy.txt | 441 | # stripe | COMMENT |
| LOW | requirements/deploy.txt | 461 | # via | COMMENT |
| LOW | requirements/deploy.txt | 481 | vine==5.1.0 | COMMENT |
| LOW | requirements/testing.txt | 1 | # | COMMENT |
| LOW | requirements/testing.txt | 21 | asgiref==3.11.1 | COMMENT |
| LOW | requirements/testing.txt | 41 | # boto3 | COMMENT |
| LOW | requirements/testing.txt | 61 | # via | COMMENT |
| LOW | requirements/testing.txt | 81 | # via | COMMENT |
| LOW | requirements/testing.txt | 101 | # -r requirements/pip.txt | COMMENT |
| LOW | requirements/testing.txt | 121 | # django-filter | COMMENT |
| LOW | requirements/testing.txt | 161 | # via | COMMENT |
| LOW | requirements/testing.txt | 181 | # via | COMMENT |
| LOW | requirements/testing.txt | 201 | drf-flex-fields==1.0.2 | COMMENT |
| LOW | requirements/testing.txt | 221 | # via -r requirements/pip.txt | COMMENT |
| LOW | requirements/testing.txt | 241 | # botocore | COMMENT |
| LOW | requirements/testing.txt | 261 | # via jinja2 | COMMENT |
| LOW | requirements/testing.txt | 281 | platformdirs==4.10.0 | COMMENT |
| LOW | requirements/testing.txt | 301 | # via | COMMENT |
| LOW | requirements/testing.txt | 321 | pyjwt[crypto]==2.13.0 | COMMENT |
| LOW | requirements/testing.txt | 341 | pytest-custom-exit-code==0.3.0 | COMMENT |
| LOW | requirements/testing.txt | 361 | python-ipware==3.0.0 | COMMENT |
| LOW | requirements/testing.txt | 381 | requests==2.34.2 | COMMENT |
| LOW | requirements/testing.txt | 401 | roman-numerals==4.1.0 | COMMENT |
| LOW | requirements/testing.txt | 421 | # elasticsearch | COMMENT |
| LOW | requirements/testing.txt | 441 | # django | COMMENT |
| LOW | requirements/testing.txt | 461 | # psycopg-pool | COMMENT |
| LOW | requirements/testing.txt | 481 | # via | COMMENT |
| LOW | requirements/testing.txt | 501 | # requests | COMMENT |
| LOW | requirements/docker.txt | 1 | # | COMMENT |
| LOW | requirements/docker.txt | 21 | # -r requirements/pip.txt | COMMENT |
| LOW | requirements/docker.txt | 41 | bumpver==2026.1132 | COMMENT |
| LOW | requirements/docker.txt | 61 | # via | COMMENT |
| LOW | requirements/docker.txt | 81 | # via | COMMENT |
| LOW | requirements/docker.txt | 101 | # pyquery | COMMENT |
| LOW | requirements/docker.txt | 121 | # django-celery-beat | COMMENT |
| LOW | requirements/docker.txt | 161 | django-impersonate==1.9.5 | COMMENT |
| LOW | requirements/docker.txt | 181 | django-vanilla-views==3.0.0 | COMMENT |
| 63 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/organizations/forms.py | 98 | except Exception: | CODE |
| LOW | readthedocs/oauth/tasks.py | 117 | except Exception: | CODE |
| LOW | readthedocs/oauth/tasks.py | 188 | except Exception: | CODE |
| LOW | readthedocs/oauth/services/bitbucket.py | 329 | except Exception: | CODE |
| LOW | readthedocs/oauth/services/gitlab.py | 357 | except Exception: | CODE |
| LOW | readthedocs/oauth/services/gitlab.py | 412 | except Exception: | CODE |
| LOW | readthedocs/oauth/services/gitlab.py | 473 | except Exception: | CODE |
| LOW | readthedocs/oauth/services/gitlab.py | 478 | except Exception: | CODE |
| LOW | readthedocs/oauth/services/github.py | 281 | except Exception: | CODE |
| LOW | readthedocs/core/signals.py | 78 | except Exception: # noqa | CODE |
| LOW | readthedocs/core/history.py | 56 | except Exception: | CODE |
| LOW | readthedocs/core/utils/contact.py | 90 | except Exception: | CODE |
| LOW | readthedocs/core/utils/tasks/public.py | 73 | except Exception as e: | CODE |
| LOW | readthedocs/core/views/hooks.py | 111 | except Exception: | CODE |
| LOW | readthedocs/embed/v3/views.py | 107 | except Exception: # noqa | CODE |
| LOW | readthedocs/embed/v3/views.py | 362 | except Exception: # noqa | CODE |
| LOW | readthedocs/projects/models.py | 2515 | except Exception: | CODE |
| LOW | readthedocs/projects/models.py | 2564 | except Exception: | CODE |
| LOW | readthedocs/projects/models.py | 2598 | except Exception: | CODE |
| MEDIUM | readthedocs/projects/forms.py | 1269 | def _get_cname(self, domain): | CODE |
| LOW | readthedocs/projects/forms.py | 1034 | except Exception as exc: | CODE |
| LOW | readthedocs/projects/forms.py | 1551 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/builds.py | 354 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/builds.py | 778 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/builds.py | 821 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/builds.py | 888 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/builds.py | 904 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/builds.py | 966 | except Exception as exc: | CODE |
| LOW | readthedocs/projects/tasks/builds.py | 990 | except Exception as exc: | CODE |
| LOW | readthedocs/projects/tasks/builds.py | 1021 | except Exception: | CODE |
| MEDIUM | readthedocs/projects/tasks/builds.py | 344 | def _check_concurrency_limit(self): | CODE |
| MEDIUM | readthedocs/projects/tasks/builds.py | 1010 | def _log_directory_size(self, directory, media_type): | CODE |
| LOW | readthedocs/projects/tasks/utils.py | 232 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/utils.py | 308 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/storage.py | 87 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/search.py | 275 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/search.py | 286 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/search.py | 331 | except Exception: | CODE |
| LOW | readthedocs/projects/tasks/search.py | 375 | except Exception: | CODE |
| LOW | readthedocs/projects/views/private.py | 353 | except Exception: | CODE |
| LOW | readthedocs/builds/tasks.py | 105 | except Exception: | CODE |
| LOW | readthedocs/builds/tasks.py | 177 | except Exception: | CODE |
| LOW | readthedocs/builds/tasks.py | 186 | except Exception: | CODE |
| LOW | readthedocs/builds/tasks.py | 373 | except Exception: | CODE |
| LOW | readthedocs/builds/tasks.py | 386 | except Exception: | CODE |
| LOW | readthedocs/builds/tasks.py | 508 | except Exception: | CODE |
| LOW | readthedocs/builds/tasks.py | 696 | except Exception: | CODE |
| LOW | readthedocs/builds/models.py | 912 | except Exception: | CODE |
| LOW | readthedocs/subscriptions/signals.py | 58 | except Exception: | CODE |
| LOW | readthedocs/subscriptions/views.py | 89 | except Exception: | CODE |
| LOW | readthedocs/search/tasks.py | 91 | except Exception: | CODE |
| LOW | readthedocs/search/parsers.py | 78 | except Exception: | CODE |
| LOW | readthedocs/search/parsers.py | 204 | except Exception as e: | CODE |
| LOW | readthedocs/search/parsers.py | 219 | except Exception: | CODE |
| LOW | readthedocs/search/parsers.py | 465 | except Exception: | CODE |
| LOW | readthedocs/search/utils.py | 70 | except Exception: | CODE |
| LOW | readthedocs/api/mixins.py | 50 | except Exception: | CODE |
| LOW | readthedocs/api/v2/views/model_views.py | 380 | except Exception: | CODE |
| LOW | readthedocs/aws/security_token_service.py | 113 | except Exception: | CODE |
| LOW | readthedocs/telemetry/collectors.py | 48 | except Exception: | CODE |
| 4 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | readthedocs/oauth/services/bitbucket.py | 0 | gets provider data from git providers webhooks api. :param project: project :type project: project :param integration: i | STRING |
| HIGH | readthedocs/oauth/services/gitlab.py | 0 | gets provider data from git providers webhooks api. :param project: project :type project: project :param integration: i | STRING |
| HIGH | readthedocs/oauth/services/github.py | 0 | gets provider data from git providers webhooks api. :param project: project :type project: project :param integration: i | STRING |
| HIGH | readthedocs/oauth/services/base.py | 0 | gets provider data from git providers webhooks api. :param project: project :type project: project :param integration: i | STRING |
| HIGH | readthedocs/oauth/services/bitbucket.py | 0 | update webhook integration. :param project: project to set up webhook for :type project: project :param integration: web | STRING |
| HIGH | readthedocs/oauth/services/gitlab.py | 0 | update webhook integration. :param project: project to set up webhook for :type project: project :param integration: web | STRING |
| HIGH | readthedocs/oauth/services/github.py | 0 | update webhook integration. :param project: project to set up webhook for :type project: project :param integration: web | STRING |
| HIGH | readthedocs/oauth/services/base.py | 0 | update webhook integration. :param project: project to set up webhook for :type project: project :param integration: web | STRING |
| HIGH | readthedocs/oauth/services/gitlab.py | 0 | create commit status for project. :param build: build to set up commit status for :type build: build :param commit: comm | STRING |
| HIGH | readthedocs/oauth/services/github.py | 0 | create commit status for project. :param build: build to set up commit status for :type build: build :param commit: comm | STRING |
| HIGH | readthedocs/oauth/services/base.py | 0 | create commit status for project. :param build: build to set up commit status for :type build: build :param commit: comm | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/organizations/apps.py | 10 | CODE | |
| LOW | readthedocs/domains/apps.py | 11 | CODE | |
| LOW | readthedocs/oauth/apps.py | 10 | CODE | |
| LOW | readthedocs/core/utils/tasks/__init__.py | 3 | CODE | |
| LOW | readthedocs/core/utils/tasks/__init__.py | 3 | CODE | |
| LOW | readthedocs/core/utils/tasks/__init__.py | 7 | CODE | |
| LOW | readthedocs/core/utils/tasks/__init__.py | 8 | CODE | |
| LOW | readthedocs/core/utils/tasks/__init__.py | 9 | CODE | |
| LOW | readthedocs/config/__init__.py | 3 | CODE | |
| LOW | readthedocs/config/__init__.py | 5 | CODE | |
| LOW | readthedocs/config/__init__.py | 6 | CODE | |
| LOW | readthedocs/projects/apps.py | 15 | CODE | |
| LOW | readthedocs/projects/apps.py | 16 | CODE | |
| LOW | readthedocs/projects/apps.py | 17 | CODE | |
| LOW | readthedocs/projects/apps.py | 18 | CODE | |
| LOW | readthedocs/projects/apps.py | 19 | CODE | |
| LOW | readthedocs/projects/tests/mockers.py | 10 | CODE | |
| LOW | readthedocs/builds/apps.py | 17 | CODE | |
| LOW | readthedocs/builds/apps.py | 18 | CODE | |
| LOW | readthedocs/subscriptions/apps.py | 13 | CODE | |
| LOW | readthedocs/subscriptions/apps.py | 14 | CODE | |
| LOW | readthedocs/subscriptions/apps.py | 15 | CODE | |
| LOW | readthedocs/subscriptions/tests/test_event_handlers.py | 8 | CODE | |
| LOW | readthedocs/search/apps.py | 9 | CODE | |
| LOW | readthedocs/gold/apps.py | 11 | CODE | |
| LOW | readthedocs/gold/tests/test_signals.py | 2 | CODE | |
| LOW | readthedocs/audit/apps.py | 14 | CODE | |
| LOW | readthedocs/telemetry/apps.py | 15 | CODE | |
| LOW | readthedocs/doc_builder/tests/test_director.py | 6 | CODE | |
| LOW | readthedocs/notifications/apps.py | 11 | CODE | |
| LOW | readthedocs/proxito/tests/handler_404_urls.py | 17 | CODE | |
| LOW | readthedocs/rtd_tests/utils.py | 14 | CODE | |
| LOW | readthedocs/rtd_tests/tests/test_project_views.py | 24 | CODE | |
| LOW | readthedocs/rtd_tests/tests/test_notifications.py | 7 | CODE | |
| LOW | readthedocs/rtd_tests/tests/test_project.py | 1 | CODE | |
| LOW | readthedocs/rtd_tests/tests/test_project.py | 11 | CODE | |
| LOW | readthedocs/rtd_tests/tests/test_project.py | 14 | CODE | |
| LOW | readthedocs/rtd_tests/tests/test_project.py | 14 | CODE | |
| LOW | readthedocs/rtd_tests/tests/test_project.py | 14 | CODE | |
| LOW | readthedocs/rtd_tests/tests/test_project.py | 22 | CODE | |
| LOW | readthedocs/rtd_tests/files/conf.py | 3 | CODE | |
| LOW | readthedocs/rtd_tests/files/conf.py | 3 | CODE | |
| LOW | readthedocs/rtd_tests/files/conf.py | 3 | CODE | |
| LOW | readthedocs/invitations/apps.py | 15 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | readthedocs/organizations/forms.py | 46 | "email": forms.EmailInput(attrs={"placeholder": "accounting@example.com"}), | CODE |
| LOW⚡ | readthedocs/organizations/forms.py | 49 | attrs={"placeholder": "Engineering docs for Example company"} | CODE |
| LOW⚡ | readthedocs/organizations/forms.py | 52 | "url": forms.TextInput(attrs={"placeholder": "https://"}), | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 186 | "email": "test@example.org", | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 197 | "email": "test@example.org", | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 209 | "email": "test@example.org", | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 218 | "email": "test@example.org", | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 229 | "email": "test@example.org", | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 240 | "email": "test@example.org", | CODE |
| LOW⚡ | readthedocs/organizations/tests/test_forms.py | 250 | "email": "test@example.org", | CODE |
| LOW | readthedocs/domains/tests/test_tasks.py | 22 | self.user = get(User, email="user@example.com") | CODE |
| LOW⚡ | readthedocs/projects/forms.py | 1485 | "version_match_pattern": forms.TextInput(attrs={"placeholder": "^release-.*$"}), | CODE |
| LOW⚡ | readthedocs/projects/forms.py | 1486 | "webhook_labels_match_pattern": forms.TextInput(attrs={"placeholder": "^docs|build$"}), | CODE |
| LOW⚡ | readthedocs/projects/forms.py | 1488 | attrs={"placeholder": "^fix|feature$"} | CODE |
| LOW | readthedocs/projects/forms.py | 91 | self.fields["repo"].widget.attrs["placeholder"] = self.placehold_repo() | CODE |
| LOW | readthedocs/projects/forms.py | 459 | self.fields["repo"].widget.attrs["placeholder"] = self.placehold_repo() | CODE |
| LOW | readthedocs/projects/forms.py | 525 | "placeholder": "\n".join( | CODE |
| LOW | readthedocs/projects/forms.py | 794 | "placeholder": "\n".join( | CODE |
| LOW | readthedocs/projects/forms.py | 903 | "options_root_selector": forms.TextInput(attrs={"placeholder": "[role=main]"}), | CODE |
| LOW | readthedocs/projects/forms.py | 1456 | "placeholder": "\n".join( | CODE |
| LOW | readthedocs/search/tests/conftest.py | 15 | from .dummy_data import ALL_PROJECTS, PROJECT_DATA_FILES | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/organizations/views/private.py | 93 | # Check if user has exactly 1 organization and automatically redirect in this case | COMMENT |
| LOW | readthedocs/core/mixins.py | 83 | # Check if resp is a redirect, which means the object was deleted | COMMENT |
| LOW⚡ | readthedocs/core/tests/test_db_utils.py | 187 | # Set limit to 1 | COMMENT |
| LOW⚡ | readthedocs/core/tests/test_db_utils.py | 329 | # Set limit to 1 | COMMENT |
| LOW | readthedocs/vcs_support/backends/git.py | 585 | # Check if ref is a branch of the origin remote | COMMENT |
| LOW | readthedocs/projects/models.py | 1081 | # Check if there is `_has_good_build` annotation in the queryset. | COMMENT |
| LOW | readthedocs/projects/tasks/builds.py | 215 | # Set GIT_SSH_COMMAND to use ssh with options that disable host key checking | COMMENT |
| LOW | readthedocs/projects/tasks/builds.py | 620 | # Check if there are multiple files on artifact directories. | COMMENT |
| LOW | readthedocs/projects/tasks/builds.py | 694 | # Check if the project is spam | COMMENT |
| LOW | readthedocs/doc_builder/director.py | 206 | # Check if the key has write access to the repository (RTD Business only). | COMMENT |
| LOW | readthedocs/doc_builder/director.py | 760 | # Set GIT_SSH_COMMAND to use ssh with options that disable host key checking | COMMENT |
| LOW | readthedocs/proxito/views/serve.py | 262 | # Check if the old language code format was used, and redirect to the new one. | COMMENT |
| LOW | readthedocs/proxito/views/serve.py | 304 | # Verify if the project is marked as spam and return a 401 in that case | COMMENT |
| LOW | readthedocs/proxito/views/serve.py | 631 | # Verify if the project is marked as spam and return a custom robots.txt | COMMENT |
| LOW | readthedocs/rtd_tests/tests/test_project_views.py | 685 | # Set version to private | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/settings/docker_compose.py | 215 | CODE | |
| LOW | readthedocs/oauth/tasks.py | 563 | CODE | |
| LOW | readthedocs/oauth/tasks.py | 642 | CODE | |
| LOW | readthedocs/core/management/commands/contact_owners.py | 122 | CODE | |
| LOW | readthedocs/core/utils/contact.py | 15 | CODE | |
| LOW | readthedocs/embed/v3/views.py | 158 | CODE | |
| LOW | readthedocs/config/config.py | 612 | CODE | |
| LOW | readthedocs/vcs_support/backends/git.py | 60 | CODE | |
| LOW | readthedocs/projects/filters.py | 55 | CODE | |
| LOW | readthedocs/projects/tasks/search.py | 233 | CODE | |
| LOW | readthedocs/projects/views/base.py | 20 | CODE | |
| LOW | readthedocs/projects/views/private.py | 291 | CODE | |
| LOW | readthedocs/projects/views/private.py | 102 | CODE | |
| LOW | readthedocs/subscriptions/views.py | 113 | CODE | |
| LOW | readthedocs/search/parsers.py | 222 | CODE | |
| LOW | readthedocs/search/api/v3/queryparser.py | 28 | CODE | |
| LOW | readthedocs/redirects/querysets.py | 50 | CODE | |
| LOW | readthedocs/api/v2/utils.py | 26 | CODE | |
| LOW | readthedocs/api/v2/views/model_views.py | 349 | CODE | |
| LOW | readthedocs/telemetry/collectors.py | 174 | CODE | |
| LOW | readthedocs/doc_builder/python_environments.py | 44 | CODE | |
| LOW | readthedocs/proxito/middleware.py | 121 | CODE | |
| LOW | readthedocs/proxito/views/hosting.py | 334 | CODE | |
| LOW | readthedocs/proxito/views/serve.py | 804 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | readthedocs/oauth/tasks.py | 364 | "single_file_name": null, | STRING |
| HIGH | readthedocs/oauth/tasks.py | 367 | "suspended_by": null, | STRING |
| HIGH | readthedocs/oauth/tasks.py | 384 | "requester": null, | STRING |
| HIGH | readthedocs/oauth/tasks.py | 462 | "single_file_name": null, | STRING |
| HIGH | readthedocs/oauth/tasks.py | 465 | "suspended_by": null, | STRING |
| HIGH | readthedocs/oauth/tasks.py | 478 | "requester": null, | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | readthedocs/vcs_support/base.py | 46 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | readthedocs/vcs_support/base.py | 48 | # ========================================================================= | COMMENT |
| MEDIUM | readthedocs/vcs_support/base.py | 101 | # ========================================================================= | COMMENT |
| MEDIUM | readthedocs/vcs_support/base.py | 103 | # ========================================================================= | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | readthedocs/search/parsers.py | 239 | # In this example, we cannot use the current <dt>'s ID because they contain invalid | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/oauth/models.py | 358 | # (or v3) to just return the linked Project (slug, url) if the ``RemoteRepository`` | COMMENT |
| LOW | readthedocs/projects/version_handling.py | 150 | # we just return the first branch found. | COMMENT |
| LOW | readthedocs/search/api/v3/executor.py | 62 | # we also just return. | COMMENT |
| LOW | readthedocs/api/v2/views/integrations.py | 139 | # In that case, we just return it as is. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/core/resolver.py | 331 | we need to check if the main translation is a subproject. | STRING |
| LOW | readthedocs/api/v2/views/integrations.py | 561 | # webhooks. If we receive a PUSH event we need to check if the webhook doesn't | COMMENT |
| LOW | readthedocs/proxito/views/hosting.py | 619 | # if only we need to check if there are results or not. | COMMENT |
| LOW | readthedocs/proxito/views/serve.py | 164 | # For .com we need to check if the project supports custom domains. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …th/management/commands/reconnect_remoterepositories.py | 54 | # TODO: consider using same login than RemoteRepository.matches method | COMMENT |
| LOW | readthedocs/api/v2/serializers.py | 398 | # TODO: handle exceptions | COMMENT |
| LOW | readthedocs/proxito/views/hosting.py | 434 | # TODO: consider adding this field into the ProjectSerializer itself. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/oauth/services/__init__.py | 10 | __all__ = [ | CODE |
| LOW | readthedocs/builds/querysets.py | 24 | __all__ = ["VersionQuerySet", "BuildQuerySet", "RelatedBuildQuerySet"] | CODE |
| LOW | readthedocs/builds/managers.py | 24 | __all__ = ["VersionManager"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/projects/views/private.py | 156 | # NOTE: This method is called twice, on .org it doesn't matter, | COMMENT |
| LOW | readthedocs/search/tasks.py | 37 | # WARNING: This must use the exact same queryset as from where we get the ID's | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | readthedocs/settings/base.py | 993 | # Everytime we need to do a re-index, make sure to check the size of the index and adjust the | STRING |
| LOW | readthedocs/projects/models.py | 739 | # make sure to use the clone URL from the repository. | COMMENT |