diff --git a/prospector-more.yml b/prospector-more.yml index d5280bf0e5a..308cdbef678 100644 --- a/prospector-more.yml +++ b/prospector-more.yml @@ -6,7 +6,6 @@ ignore-paths: - api/ - cdn/ - comments/ - - core/ - doc_builder/ - donate/ - notifications/ diff --git a/readthedocs/core/__init__.py b/readthedocs/core/__init__.py index 081e5c19f4d..ed1c53debf0 100644 --- a/readthedocs/core/__init__.py +++ b/readthedocs/core/__init__.py @@ -1 +1,3 @@ +"""App initialization.""" + default_app_config = 'readthedocs.core.apps.CoreAppConfig' diff --git a/readthedocs/core/adapters.py b/readthedocs/core/adapters.py index c54990ad2e8..76f00a9fea7 100644 --- a/readthedocs/core/adapters.py +++ b/readthedocs/core/adapters.py @@ -35,7 +35,7 @@ def send_mail(self, template_prefix, email, context): removed_keys = [] for key in context.keys(): try: - _ = pickle.dumps(context[key]) + _ = pickle.dumps(context[key]) # noqa for F841 except (pickle.PickleError, TypeError): removed_keys.append(key) del context[key] diff --git a/readthedocs/core/admin.py b/readthedocs/core/admin.py index 29feb2dd661..9ec5edcd36f 100644 --- a/readthedocs/core/admin.py +++ b/readthedocs/core/admin.py @@ -53,6 +53,9 @@ def queryset(self, request, queryset): class UserAdminExtra(UserAdmin): + + """Admin configuration for User.""" + list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'is_banned') list_filter = (UserProjectFilter,) + UserAdmin.list_filter diff --git a/readthedocs/core/apps.py b/readthedocs/core/apps.py index d5c7c6b0e5b..d422684ba03 100644 --- a/readthedocs/core/apps.py +++ b/readthedocs/core/apps.py @@ -1,3 +1,5 @@ +"""App configurations for core app.""" + from django.apps import AppConfig diff --git a/readthedocs/core/backends.py b/readthedocs/core/backends.py index f896fb8281f..72babeba1a9 100644 --- a/readthedocs/core/backends.py +++ b/readthedocs/core/backends.py @@ -1,3 +1,5 @@ +"""Email backends for core app.""" + import smtplib from django.core.mail.utils import DNS_NAME @@ -15,6 +17,6 @@ def open(self): if self.username and self.password: self.connection.login(self.username, self.password) return True - except: + except Exception as e: if not self.fail_silently: - raise + raise e diff --git a/readthedocs/core/context_processors.py b/readthedocs/core/context_processors.py index 2494edb784c..d08fe652e18 100644 --- a/readthedocs/core/context_processors.py +++ b/readthedocs/core/context_processors.py @@ -1,3 +1,5 @@ +"""Template context processors for core app.""" + from django.conf import settings diff --git a/readthedocs/core/forms.py b/readthedocs/core/forms.py index 70acdcfc086..43868a2b6f9 100644 --- a/readthedocs/core/forms.py +++ b/readthedocs/core/forms.py @@ -1,3 +1,5 @@ +"""Forms for core app.""" + import logging from haystack.forms import SearchForm diff --git a/readthedocs/core/management/commands/clean_builds.py b/readthedocs/core/management/commands/clean_builds.py index 89164c2a225..3b4dc223e4a 100644 --- a/readthedocs/core/management/commands/clean_builds.py +++ b/readthedocs/core/management/commands/clean_builds.py @@ -1,3 +1,4 @@ + from datetime import datetime, timedelta import logging from optparse import make_option diff --git a/readthedocs/core/management/commands/import_github_language.py b/readthedocs/core/management/commands/import_github_language.py index d1540f008db..3af954d62ab 100644 --- a/readthedocs/core/management/commands/import_github_language.py +++ b/readthedocs/core/management/commands/import_github_language.py @@ -26,6 +26,7 @@ class Command(BaseCommand): """ def handle(self, *args, **options): + # pylint: disable=too-many-locals token = os.environ.get('GITHUB_AUTH_TOKEN') if not token: print 'Invalid GitHub token, exiting' diff --git a/readthedocs/core/management/commands/pull.py b/readthedocs/core/management/commands/pull.py index cc563e406e1..2cb54350be9 100644 --- a/readthedocs/core/management/commands/pull.py +++ b/readthedocs/core/management/commands/pull.py @@ -1,7 +1,6 @@ import logging from django.core.management.base import BaseCommand -from django.conf import settings from readthedocs.builds.constants import LATEST from readthedocs.projects import tasks, utils diff --git a/readthedocs/core/management/commands/reindex_elasticsearch.py b/readthedocs/core/management/commands/reindex_elasticsearch.py index d7b8176e376..6fe868ccc64 100644 --- a/readthedocs/core/management/commands/reindex_elasticsearch.py +++ b/readthedocs/core/management/commands/reindex_elasticsearch.py @@ -32,12 +32,12 @@ def handle(self, *args, **options): if not queryset.exists(): raise CommandError( 'No project with slug: {slug}'.format(slug=project)) - log.info("Building all versions for %s" % project) + log.info("Building all versions for %s", project) elif getattr(settings, 'INDEX_ONLY_LATEST', True): queryset = queryset.filter(slug=LATEST) for version in queryset: - log.info("Reindexing %s" % version) + log.info("Reindexing %s", version) try: commit = version.project.vcs_repo(version.slug).commit except: @@ -48,4 +48,4 @@ def handle(self, *args, **options): update_search(version.pk, commit, delete_non_commit_files=False) except Exception: - log.error('Reindex failed for %s' % version, exc_info=True) + log.error('Reindex failed for %s', version, exc_info=True) diff --git a/readthedocs/core/management/commands/set_metadata.py b/readthedocs/core/management/commands/set_metadata.py index 3bd6f0e9033..a9e322b3d21 100644 --- a/readthedocs/core/management/commands/set_metadata.py +++ b/readthedocs/core/management/commands/set_metadata.py @@ -1,8 +1,6 @@ import logging -from optparse import make_option from django.core.management.base import BaseCommand -from django.conf import settings from readthedocs.projects import tasks from readthedocs.projects.models import Project @@ -14,8 +12,8 @@ class Command(BaseCommand): def handle(self, *args, **options): queryset = Project.objects.all() for p in queryset: - log.info("Generating metadata for %s" % p) + log.info("Generating metadata for %s", p) try: tasks.update_static_metadata(p.pk) except Exception: - log.error('Build failed for %s' % p, exc_info=True) + log.error('Build failed for %s', p, exc_info=True) diff --git a/readthedocs/core/management/commands/update_api.py b/readthedocs/core/management/commands/update_api.py index 8a3100b2389..7735510acec 100644 --- a/readthedocs/core/management/commands/update_api.py +++ b/readthedocs/core/management/commands/update_api.py @@ -27,5 +27,5 @@ def handle(self, *args, **options): for slug in options['projects']: project_data = api.project(slug).get() p = tasks.make_api_project(project_data) - log.info("Building %s" % p) + log.info("Building %s", p) tasks.update_docs.run(pk=p.pk, docker=docker) diff --git a/readthedocs/core/management/commands/update_repos.py b/readthedocs/core/management/commands/update_repos.py index 394958a59af..44ca6438674 100644 --- a/readthedocs/core/management/commands/update_repos.py +++ b/readthedocs/core/management/commands/update_repos.py @@ -42,11 +42,11 @@ def handle(self, *args, **options): if len(args): for slug in args: if version and version != "all": - log.info("Updating version %s for %s" % (version, slug)) + log.info("Updating version %s for %s", version, slug) for version in Version.objects.filter(project__slug=slug, slug=version): trigger_build(project=version.project, version=version) elif version == "all": - log.info("Updating all versions for %s" % slug) + log.info("Updating all versions for %s", slug) for version in Version.objects.filter(project__slug=slug, active=True, uploaded=False): @@ -55,7 +55,7 @@ def handle(self, *args, **options): version_pk=version.pk) else: p = Project.all_objects.get(slug=slug) - log.info("Building %s" % p) + log.info("Building %s", p) trigger_build(project=p, force=force, record=record) else: if version == "all": diff --git a/readthedocs/core/middleware.py b/readthedocs/core/middleware.py index 7cf32bfdaf4..a737e1f94be 100644 --- a/readthedocs/core/middleware.py +++ b/readthedocs/core/middleware.py @@ -1,3 +1,5 @@ +"""Middleware for core app.""" + import logging from django.utils.translation import ugettext_lazy as _ diff --git a/readthedocs/core/models.py b/readthedocs/core/models.py index 5ef8aefb8b6..d633823a89e 100644 --- a/readthedocs/core/models.py +++ b/readthedocs/core/models.py @@ -1,3 +1,5 @@ +"""Models for the core app.""" + import logging from django.db import models diff --git a/readthedocs/core/signals.py b/readthedocs/core/signals.py index 5ff5a472deb..aab87d50dba 100644 --- a/readthedocs/core/signals.py +++ b/readthedocs/core/signals.py @@ -1,3 +1,5 @@ +"""Signal handling for core app.""" + import logging from urlparse import urlparse @@ -16,7 +18,7 @@ webhook_bitbucket = Signal(providing_args=['project', 'data', 'event']) -def decide_if_cors(sender, request, **kwargs): +def decide_if_cors(sender, request, **kwargs): # pylint: disable=unused-argument """ Decide whether a request should be given CORS access. diff --git a/readthedocs/core/templatetags/core_tags.py b/readthedocs/core/templatetags/core_tags.py index 57de3d3d4fa..94309b60805 100644 --- a/readthedocs/core/templatetags/core_tags.py +++ b/readthedocs/core/templatetags/core_tags.py @@ -1,3 +1,5 @@ +"""Template tags for core app.""" + import urllib import hashlib @@ -68,7 +70,7 @@ def restructuredtext(value, short=False): def get_project(slug): try: return Project.objects.get(slug=slug) - except: + except Project.DoesNotExist: return None @@ -76,7 +78,7 @@ def get_project(slug): def get_version(slug): try: return Project.objects.get(slug=slug) - except: + except Project.DoesNotExist: return None diff --git a/readthedocs/core/urls/__init__.py b/readthedocs/core/urls/__init__.py index c3ef48e2a1d..1bda8c5cab6 100644 --- a/readthedocs/core/urls/__init__.py +++ b/readthedocs/core/urls/__init__.py @@ -1,3 +1,5 @@ +"""URL configuration for core app.""" + from django.conf.urls import url from django_filters import views as django_filters_views diff --git a/readthedocs/core/urls/single_version.py b/readthedocs/core/urls/single_version.py index d904db91de5..136a3461bd4 100644 --- a/readthedocs/core/urls/single_version.py +++ b/readthedocs/core/urls/single_version.py @@ -1,3 +1,5 @@ +"""URL configuration for a single version.""" + from operator import add from django.conf.urls import url diff --git a/readthedocs/core/urls/subdomain.py b/readthedocs/core/urls/subdomain.py index f3532c6d01a..eb27a471042 100644 --- a/readthedocs/core/urls/subdomain.py +++ b/readthedocs/core/urls/subdomain.py @@ -1,3 +1,5 @@ +"""URL configurations for subdomains.""" + from operator import add from django.conf.urls import url, patterns diff --git a/readthedocs/core/utils/__init__.py b/readthedocs/core/utils/__init__.py index 3f4a3d17ce1..b9dbd30cd2a 100644 --- a/readthedocs/core/utils/__init__.py +++ b/readthedocs/core/utils/__init__.py @@ -23,7 +23,7 @@ def run_on_app_servers(command): """A helper to copy a single file across app servers""" - log.info("Running %s on app servers" % command) + log.info("Running %s on app servers", command) ret_val = 0 if getattr(settings, "MULTIPLE_APP_SERVERS", None): for server in settings.MULTIPLE_APP_SERVERS: @@ -36,7 +36,7 @@ def run_on_app_servers(command): return ret -def broadcast(type, task, args): +def broadcast(type, task, args): # pylint: disable=redefined-builtin assert type in ['web', 'app', 'build'] default_queue = getattr(settings, 'CELERY_DEFAULT_QUEUE', 'celery') if type in ['web', 'app']: @@ -53,11 +53,11 @@ def broadcast(type, task, args): def clean_url(url): parsed = urlparse(url) if parsed.scheme: - scheme, netloc = parsed.scheme, parsed.netloc + _, netloc = parsed.scheme, parsed.netloc # noqa for F841 elif parsed.netloc: - scheme, netloc = "http", parsed.netloc + _, netloc = "http", parsed.netloc # noqa for F841 else: - scheme, netloc = "http", parsed.path + _, netloc = "http", parsed.path # noqa for F841 return netloc @@ -126,7 +126,7 @@ def trigger_build(project, version=None, record=True, force=False, basic=False): def send_email(recipient, subject, template, template_html, context=None, - request=None): + request=None): # pylint: disable=unused-argument """Alter context passed in and call email send task .. seealso:: diff --git a/readthedocs/core/utils/extend.py b/readthedocs/core/utils/extend.py index 9e25d0ce180..5707f5aed5b 100644 --- a/readthedocs/core/utils/extend.py +++ b/readthedocs/core/utils/extend.py @@ -21,6 +21,7 @@ def get_override_class(proxy_class, default_class=None): proxy_class.__name__ ]) class_path = getattr(settings, 'CLASS_OVERRIDES', {}).get(class_id) + # pylint: disable=protected-access if class_path is None and proxy_class._override_setting is not None: class_path = getattr(settings, proxy_class._override_setting, None) if class_path is not None: diff --git a/readthedocs/core/utils/tasks/__init__.py b/readthedocs/core/utils/tasks/__init__.py index 766f899f1cc..419f0780eba 100644 --- a/readthedocs/core/utils/tasks/__init__.py +++ b/readthedocs/core/utils/tasks/__init__.py @@ -1,7 +1,7 @@ -from .permission_checks import user_id_matches -from .public import PublicTask -from .public import TaskNoPermission -from .public import permission_check -from .public import get_public_task_data -from .retrieve import TaskNotFound -from .retrieve import get_task_data +from .permission_checks import user_id_matches # noqa +from .public import PublicTask # noqa +from .public import TaskNoPermission # noqa +from .public import permission_check # noqa +from .public import get_public_task_data # noqa +from .retrieve import TaskNotFound # noqa +from .retrieve import get_task_data # noqa diff --git a/readthedocs/core/utils/tasks/permission_checks.py b/readthedocs/core/utils/tasks/permission_checks.py index 91ac5d1372c..b9fb0674050 100644 --- a/readthedocs/core/utils/tasks/permission_checks.py +++ b/readthedocs/core/utils/tasks/permission_checks.py @@ -1,7 +1,7 @@ __all__ = ('user_id_matches',) -def user_id_matches(request, state, context): +def user_id_matches(request, state, context): # pylint: disable=unused-argument user_id = context.get('user_id', None) if user_id is not None and request.user.is_authenticated(): if request.user.id == user_id: diff --git a/readthedocs/core/utils/tasks/public.py b/readthedocs/core/utils/tasks/public.py index f9fcd0e5e21..a82a199e020 100644 --- a/readthedocs/core/utils/tasks/public.py +++ b/readthedocs/core/utils/tasks/public.py @@ -67,7 +67,7 @@ def run(self, *args, **kwargs): result = self.run_public(*args, **kwargs) if result is not None: self.set_public_data(result) - state, info = self.get_task_data() + _, info = self.get_task_data() return info def after_return(self, status, retval, task_id, args, kwargs, einfo): diff --git a/readthedocs/core/utils/tasks/retrieve.py b/readthedocs/core/utils/tasks/retrieve.py index ee1fb362abc..9fdb33efdfc 100644 --- a/readthedocs/core/utils/tasks/retrieve.py +++ b/readthedocs/core/utils/tasks/retrieve.py @@ -1,3 +1,5 @@ +"""Utilities for retrieving task data.""" + from djcelery import celery as celery_app from celery.result import AsyncResult diff --git a/readthedocs/core/validators.py b/readthedocs/core/validators.py index 70d5c84b001..7b4c904f39c 100644 --- a/readthedocs/core/validators.py +++ b/readthedocs/core/validators.py @@ -1,3 +1,5 @@ +"""Validators for core app.""" + # From https://github.com/django/django/pull/3477/files import re diff --git a/readthedocs/core/views/__init__.py b/readthedocs/core/views/__init__.py index 60664549d7c..8cf4ea3d7ff 100644 --- a/readthedocs/core/views/__init__.py +++ b/readthedocs/core/views/__init__.py @@ -68,7 +68,7 @@ def get_context_data(self, **kwargs): return context -def random_page(request, project_slug=None): +def random_page(request, project_slug=None): # pylint: disable=unused-argument imported_file = ImportedFile.objects.order_by('?') if project_slug: imported_file = imported_file.filter(project__slug=project_slug) @@ -100,11 +100,11 @@ def wipe_version(request, project_slug, version_slug): context_instance=RequestContext(request)) -def divide_by_zero(request): +def divide_by_zero(request): # pylint: disable=unused-argument return 1 / 0 -def server_error_500(request, exception, template_name='500.html'): +def server_error_500(request, exception, template_name='500.html'): # pylint: disable=unused-argument # noqa """A simple 500 handler so we get media""" r = render_to_response(template_name, context_instance=RequestContext(request)) @@ -112,7 +112,7 @@ def server_error_500(request, exception, template_name='500.html'): return r -def server_error_404(request, exception, template_name='404.html'): +def server_error_404(request, exception, template_name='404.html'): # pylint: disable=unused-argument # noqa """A simple 404 handler so we get media""" response = get_redirect_response(request, path=request.get_full_path()) if response: diff --git a/readthedocs/core/views/hooks.py b/readthedocs/core/views/hooks.py index af4613953ca..e4e0b10725a 100644 --- a/readthedocs/core/views/hooks.py +++ b/readthedocs/core/views/hooks.py @@ -1,3 +1,5 @@ +"""Views pertaining to builds.""" + import json import re @@ -36,26 +38,26 @@ def _build_version(project, slug, already_built=()): # active latest_version = project.versions.get(slug=LATEST) trigger_build(project=project, version=latest_version, force=True) - log.info(("(Version build) Building %s:%s" - % (project.slug, latest_version.slug))) + log.info("(Version build) Building %s:%s", + project.slug, latest_version.slug) if project.versions.exclude(active=False).filter(slug=slug).exists(): # Handle the case where we want to build the custom branch too slug_version = project.versions.get(slug=slug) trigger_build(project=project, version=slug_version, force=True) - log.info(("(Version build) Building %s:%s" - % (project.slug, slug_version.slug))) + log.info("(Version build) Building %s:%s", + project.slug, slug_version.slug) return LATEST elif project.versions.exclude(active=True).filter(slug=slug).exists(): - log.info(("(Version build) Not Building %s" % slug)) + log.info("(Version build) Not Building %s", slug) return None elif slug not in already_built: version = project.versions.get(slug=slug) trigger_build(project=project, version=version, force=True) - log.info(("(Version build) Building %s:%s" - % (project.slug, version.slug))) + log.info("(Version build) Building %s:%s", + project.slug, version.slug) return slug else: - log.info(("(Version build) Not Building %s" % slug)) + log.info("(Version build) Not Building %s", slug) return None @@ -72,8 +74,8 @@ def build_branches(project, branch_list): to_build = set() not_building = set() for version in versions: - log.info(("(Branch Build) Processing %s:%s" - % (project.slug, version.slug))) + log.info("(Branch Build) Processing %s:%s", + project.slug, version.slug) ret = _build_version(project, version.slug, already_built=to_build) if ret: to_build.add(ret) @@ -304,14 +306,14 @@ def generic_build(request, project_id_or_slug=None): project = Project.objects.get(slug=project_id_or_slug) except (Project.DoesNotExist, ValueError): log.error( - "(Incoming Generic Build) Repo not found: %s" % ( - project_id_or_slug)) + "(Incoming Generic Build) Repo not found: %s", + project_id_or_slug) return HttpResponseNotFound( 'Repo not found: %s' % project_id_or_slug) if request.method == 'POST': slug = request.POST.get('version_slug', project.default_version) log.info( - "(Incoming Generic Build) %s [%s]" % (project.slug, slug)) + "(Incoming Generic Build) %s [%s]", project.slug, slug) _build_version(project, slug) else: return HttpResponse("You must POST to this resource.") diff --git a/readthedocs/core/views/serve.py b/readthedocs/core/views/serve.py index 09f663015c7..6f0663c25f8 100644 --- a/readthedocs/core/views/serve.py +++ b/readthedocs/core/views/serve.py @@ -95,14 +95,14 @@ def inner_view(request, project=None, project_slug=None, *args, **kwargs): @map_project_slug @map_subproject_slug -def redirect_project_slug(request, project, subproject): +def redirect_project_slug(request, project, subproject): # pylint: disable=unused-argument """Handle / -> /en/latest/ directs on subdomains""" return HttpResponseRedirect(resolve(subproject or project)) @map_project_slug @map_subproject_slug -def redirect_page_with_filename(request, project, subproject, filename): +def redirect_page_with_filename(request, project, subproject, filename): # pylint: disable=unused-argument # noqa """Redirect /page/file.html to /en/latest/file.html.""" return HttpResponseRedirect(resolve(subproject or project, filename=filename)) @@ -170,7 +170,7 @@ def serve_docs(request, project, subproject, @map_project_slug def _serve_symlink_docs(request, project, privacy_level, filename=''): - + """Serve a file by symlink, or a 404 if not found.""" # Handle indexes if filename == '' or filename[-1] == '/': filename += 'index.html' @@ -179,7 +179,7 @@ def _serve_symlink_docs(request, project, privacy_level, filename=''): if filename[0] == '/': filename = filename[1:] - log.info('Serving %s for %s' % (filename, project)) + log.info('Serving %s for %s', filename, project) files_tried = []