Make a pass with futurize on stage 2.

Depend on futurize.
gthank-master
Hank Gay 2017-05-30 18:09:59 -04:00
parent f201d150dd
commit 64116bc541
77 changed files with 192 additions and 92 deletions

View File

@ -1,5 +1,6 @@
"""API resources"""
from __future__ import absolute_import
from builtins import object
import logging
import json
import redis

View File

@ -1,5 +1,6 @@
"""Utility classes for api module"""
from __future__ import absolute_import
from builtins import object
import logging
from django.core.paginator import Paginator, InvalidPage

View File

@ -1,6 +1,7 @@
"""Models for the bookmarks app."""
from __future__ import absolute_import
from builtins import object
from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _, ugettext
@ -24,7 +25,7 @@ class Bookmark(models.Model):
date = models.DateTimeField(_('Date'), auto_now_add=True)
url = models.CharField(_('URL'), max_length=255, null=True, blank=True)
class Meta:
class Meta(object):
ordering = ['-date']
unique_together = ('user', 'project', 'version', 'page')

View File

@ -1,6 +1,7 @@
"""Django forms for the builds app."""
from __future__ import absolute_import
from builtins import object
from django import forms
from readthedocs.builds.models import VersionAlias, Version
@ -10,7 +11,7 @@ from readthedocs.core.utils import trigger_build
class AliasForm(forms.ModelForm):
class Meta:
class Meta(object):
model = VersionAlias
fields = (
'project',
@ -28,7 +29,7 @@ class AliasForm(forms.ModelForm):
class VersionForm(forms.ModelForm):
class Meta:
class Meta(object):
model = Version
fields = ['active', 'privacy_level', 'tags']

View File

@ -1,6 +1,7 @@
"""Models for the builds app."""
from __future__ import absolute_import
from builtins import object
import logging
import re
import os.path
@ -78,7 +79,7 @@ class Version(models.Model):
objects = VersionManager.from_queryset(VersionQuerySet)()
class Meta:
class Meta(object):
unique_together = [('project', 'slug')]
ordering = ['-verbose_name']
permissions = (
@ -349,7 +350,7 @@ class Build(models.Model):
objects = BuildQuerySet.as_manager()
class Meta:
class Meta(object):
ordering = ['-date']
get_latest_by = 'date'
index_together = [
@ -411,7 +412,7 @@ class BuildCommandResult(BuildCommandResultMixin, models.Model):
start_time = models.DateTimeField(_('Start time'))
end_time = models.DateTimeField(_('End time'))
class Meta:
class Meta(object):
ordering = ['start_time']
get_latest_by = 'start_time'

View File

@ -17,6 +17,7 @@ another number would be confusing.
"""
from __future__ import absolute_import
from builtins import range
import math
import re
import string

View File

@ -1,6 +1,7 @@
"""Views for builds app."""
from __future__ import absolute_import
from builtins import object
import logging
from django.shortcuts import get_object_or_404

View File

@ -1,6 +1,7 @@
"""Utility to purge MaxCDN files, if configured."""
from __future__ import absolute_import
from builtins import range
import logging
from django.conf import settings

View File

@ -1,6 +1,8 @@
"""Models for the comments app."""
from __future__ import absolute_import
from builtins import str
from builtins import object
from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import ugettext_lazy as _
@ -110,7 +112,7 @@ class DocumentNodeSerializer(serializers.ModelSerializer):
last_commit = serializers.CharField(source='latest_commit')
snapshots_count = serializers.CharField(source='snapshots.count')
class Meta:
class Meta(object):
model = DocumentNode
exclude = ('')
@ -121,7 +123,7 @@ class NodeSnapshot(models.Model):
node = models.ForeignKey(DocumentNode, related_name="snapshots")
commit = models.CharField(max_length=255)
class Meta:
class Meta(object):
get_latest_by = 'date'
# Snapshots are *almost* unique_together just for node and hash,
# but for the possibility that a node's hash might change and then change back
@ -194,7 +196,7 @@ class DocumentComment(models.Model):
class DocumentCommentSerializer(serializers.ModelSerializer):
node = DocumentNodeSerializer()
class Meta:
class Meta(object):
model = DocumentComment
fields = ('date', 'user', 'text', 'node')
@ -225,7 +227,7 @@ class ModerationAction(models.Model):
def __unicode__(self):
return "%s - %s" % (self.user_id, self.get_decision_display())
class Meta:
class Meta(object):
get_latest_by = 'date'
def approved(self):
@ -234,6 +236,6 @@ class ModerationAction(models.Model):
class ModerationActionSerializer(serializers.ModelSerializer):
class Meta:
class Meta(object):
model = ModerationAction
exclude = ()

View File

@ -34,7 +34,7 @@ class AccountAdapter(DefaultAccountAdapter):
# Allauth sends some additional data in the context, remove it if the
# pieces can't be pickled
removed_keys = []
for key in context.keys():
for key in list(context.keys()):
try:
_ = pickle.dumps(context[key]) # noqa for F841
except (pickle.PickleError, TypeError):

View File

@ -1,6 +1,7 @@
"""Forms for core app."""
from __future__ import absolute_import
from builtins import object
import logging
from haystack.forms import SearchForm
@ -18,7 +19,7 @@ class UserProfileForm(forms.ModelForm):
first_name = CharField(label=_('First name'), required=False)
last_name = CharField(label=_('Last name'), required=False)
class Meta:
class Meta(object):
model = UserProfile
# Don't allow users edit someone else's user page,
fields = ['first_name', 'last_name', 'homepage']

View File

@ -1,6 +1,7 @@
"""Middleware for core app."""
from __future__ import absolute_import
from builtins import object
import logging
from django.utils.translation import ugettext_lazy as _

View File

@ -1,6 +1,7 @@
"""Common mixin classes for views"""
from __future__ import absolute_import
from builtins import object
from vanilla import ListView
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

View File

@ -1,6 +1,7 @@
"""URL resolver for documentation"""
from __future__ import absolute_import
from builtins import object
import re
from django.conf import settings

View File

@ -1,6 +1,7 @@
"""Class based settings for complex settings inheritance"""
from __future__ import absolute_import
from builtins import object
import inspect
import sys

View File

@ -1,8 +1,10 @@
"""Signal handling for core app."""
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
import logging
from urlparse import urlparse
from urllib.parse import urlparse
from django.dispatch import Signal
from corsheaders import signals

View File

@ -54,6 +54,7 @@ Example layout
"""
from __future__ import absolute_import
from builtins import object
import os
import shutil
import logging
@ -188,7 +189,7 @@ class Symlink(object):
if rel.alias:
from_to[rel.alias] = rel.child.slug
subprojects.add(rel.alias)
for from_slug, to_slug in from_to.items():
for from_slug, to_slug in list(from_to.items()):
self._log(u"Symlinking subproject: {0} -> {1}".format(from_slug, to_slug))
symlink = os.path.join(self.subproject_root, from_slug)
docs_dir = os.path.join(
@ -223,7 +224,7 @@ class Symlink(object):
if not os.path.lexists(language_dir):
safe_makedirs(language_dir)
for (language, slug) in translations.items():
for (language, slug) in list(translations.items()):
self._log(u"Symlinking translation: {0}->{1}".format(language, slug))
symlink = os.path.join(self.project_root, language)
docs_dir = os.path.join(self.WEB_ROOT, slug, language)

View File

@ -1,7 +1,10 @@
"""Template tags for core app."""
from __future__ import absolute_import
import urllib
from future import standard_library
standard_library.install_aliases()
from builtins import str
import urllib.request, urllib.parse, urllib.error
import hashlib
from django import template
@ -23,7 +26,7 @@ def gravatar(email, size=48):
render an img tag with the hashed up bits needed for leetness
omgwtfstillreading
"""
url = "http://www.gravatar.com/avatar.php?%s" % urllib.urlencode({
url = "http://www.gravatar.com/avatar.php?%s" % urllib.parse.urlencode({
'gravatar_id': hashlib.md5(email).hexdigest(),
'size': str(size)
})

View File

@ -1,12 +1,14 @@
"""Common utilty functions"""
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
import errno
import getpass
import logging
import os
import re
from urlparse import urlparse
from urllib.parse import urlparse
from django.conf import settings
from django.utils import six

View File

@ -5,6 +5,8 @@ documentation and header rendering, and server errors.
"""
from __future__ import absolute_import
from __future__ import division
from past.utils import old_div
import os
import logging
@ -102,7 +104,7 @@ def wipe_version(request, project_slug, version_slug):
def divide_by_zero(request): # pylint: disable=unused-argument
return 1 / 0
return old_div(1, 0)
def server_error_500(request, exception, template_name='500.html'): # pylint: disable=unused-argument # noqa

View File

@ -118,14 +118,14 @@ def _build_url(url, projects, branches):
all_built[project.slug] = built
all_not_building[project.slug] = not_building
for project_slug, built in all_built.items():
for project_slug, built in list(all_built.items()):
if built:
msg = '(URL Build) Build Started: %s [%s]' % (
url, ' '.join(built))
log_info(project_slug, msg=msg)
ret += msg
for project_slug, not_building in all_not_building.items():
for project_slug, not_building in list(all_not_building.items()):
if not_building:
msg = '(URL Build) Not Building: %s [%s]' % (
url, ' '.join(not_building))

View File

@ -1,6 +1,7 @@
"""Base classes for Builders."""
from __future__ import absolute_import
from builtins import object
from functools import wraps
import os
import logging

View File

@ -1,6 +1,8 @@
"""An API to load config from a readthedocs.yml file."""
from __future__ import absolute_import
from builtins import filter
from builtins import object
from readthedocs_build.config import (ConfigError, BuildConfig, InvalidConfig,
load as load_config)

View File

@ -1,6 +1,8 @@
"""Documentation Builder Environments"""
from __future__ import absolute_import
from builtins import str
from builtins import object
import os
import re
import sys
@ -420,7 +422,7 @@ class BuildEnvironment(object):
"An unexpected error occurred")
# Attempt to stop unicode errors on build reporting
for key, val in self.build.items():
for key, val in list(self.build.items()):
if isinstance(val, six.string_types):
self.build[key] = val.decode('utf-8', 'ignore')

View File

@ -1,6 +1,7 @@
"""An abstraction over virtualenv and Conda environments."""
from __future__ import absolute_import
from builtins import object
import logging
import os
import shutil

View File

@ -1,6 +1,7 @@
"""Forms for RTD donations"""
from __future__ import absolute_import
from builtins import object
import logging
from django import forms
@ -23,7 +24,7 @@ class SupporterForm(StripeResourceMixin, StripeModelForm):
:py:class:`StripeModelForm`
"""
class Meta:
class Meta(object):
model = Supporter
fields = (
'last_4_digits',
@ -97,7 +98,7 @@ class EthicalAdForm(StripeResourceMixin, StripeModelForm):
:py:class:`StripeModelForm`
"""
class Meta:
class Meta(object):
model = Supporter
fields = (
'last_4_digits',

View File

@ -1,6 +1,9 @@
"""Mixin classes for donation views"""
from __future__ import absolute_import
from __future__ import division
from builtins import object
from past.utils import old_div
from django.db.models import Avg, Sum
from .models import Supporter
@ -19,7 +22,7 @@ class DonateProgressMixin(object):
dollars = sums.get('dollars', None) or 0
avg = int(avgs.get('dollars', None) or 0)
count = Supporter.objects.count()
percent = int((float(dollars) / 24000.0) * 100.0)
percent = int((old_div(float(dollars), 24000.0)) * 100.0)
context.update({
'donate_amount': dollars,
'donate_avg': avg,

View File

@ -3,6 +3,9 @@
# pylint: disable=redefined-builtin
from __future__ import absolute_import
from __future__ import division
from past.utils import old_div
from builtins import object
from django.db import models
from django.utils.crypto import get_random_string
from django.utils.translation import ugettext_lazy as _
@ -68,7 +71,7 @@ class SupporterPromo(models.Model):
blank=True, null=True)
live = models.BooleanField(_('Live'), default=False)
class Meta:
class Meta(object):
ordering = ('analytics_id', '-live')
def __unicode__(self):
@ -136,7 +139,7 @@ class SupporterPromo(models.Model):
return impression.click_ratio
def views_per_day(self):
return int(float(self.sold_impressions) / float(self.sold_days))
return int(old_div(float(self.sold_impressions), float(self.sold_days)))
def views_shown_today(self, day=None):
if not day:
@ -160,7 +163,7 @@ class SupporterPromo(models.Model):
if self.total_views() == 0:
return float(0)
return '%.4f' % float(
(float(self.total_clicks()) / float(self.total_views())) * 100
(old_div(float(self.total_clicks()), float(self.total_views()))) * 100
)
def report_html_text(self):
@ -179,7 +182,7 @@ class BaseImpression(models.Model):
views = models.IntegerField(_('View'), default=0)
clicks = models.IntegerField(_('Clicks'), default=0)
class Meta:
class Meta(object):
ordering = ('-date',)
unique_together = ('promo', 'date')
abstract = True
@ -229,7 +232,7 @@ class ProjectImpressions(BaseImpression):
project = models.ForeignKey(Project, related_name='impressions',
blank=True, null=True)
class Meta:
class Meta(object):
unique_together = ('project', 'promo', 'date')
def __unicode__(self):

View File

@ -1,4 +1,5 @@
from __future__ import absolute_import
from builtins import range
import json
import mock

View File

@ -1,6 +1,7 @@
"""Gold subscription forms"""
from __future__ import absolute_import
from builtins import object
from django import forms
from stripe.error import InvalidRequestError
@ -19,7 +20,7 @@ class GoldSubscriptionForm(StripeResourceMixin, StripeModelForm):
:py:class:`StripeResourceMixin` for common operations against the Stripe API.
"""
class Meta:
class Meta(object):
model = GoldUser
fields = ['last_4_digits', 'level']

View File

@ -1,5 +1,7 @@
"""Django models for recurring donations aka Gold Membership."""
from __future__ import absolute_import
from __future__ import division
from past.utils import old_div
import math
from django.db import models
@ -45,5 +47,5 @@ class GoldUser(models.Model):
@property
def num_supported_projects(self):
dollars = int(self.level.split('-')[-1])
num_projects = int(math.floor(dollars / DOLLARS_PER_PROJECT))
num_projects = int(math.floor(old_div(dollars, DOLLARS_PER_PROJECT)))
return num_projects

View File

@ -1,6 +1,10 @@
"""Integration models for external services"""
from __future__ import absolute_import
from __future__ import division
from builtins import str
from past.utils import old_div
from builtins import object
import json
import uuid
import re
@ -60,13 +64,13 @@ class HttpExchangeManager(models.Manager):
# title case-y hyphen separated values.
request_headers = dict(
(key[5:].title().replace('_', '-'), str(val))
for (key, val) in req.META.items()
for (key, val) in list(req.META.items())
if key.startswith('HTTP_')
)
request_headers['Content-Type'] = req.content_type
# Remove unwanted headers
for filter_rule in self.REQ_FILTER_RULES:
for key in request_headers.keys():
for key in list(request_headers.keys()):
if filter_rule.match(key):
del request_headers[key]
@ -128,7 +132,7 @@ class HttpExchange(models.Model):
objects = HttpExchangeManager()
class Meta:
class Meta(object):
ordering = ['-date']
def __unicode__(self):
@ -137,7 +141,7 @@ class HttpExchange(models.Model):
@property
def failed(self):
# Assume anything that isn't 2xx level status code is an error
return int(self.status_code / 100) != 2
return int(old_div(self.status_code, 100)) != 2
def formatted_json(self, field):
"""Try to return pretty printed and Pygment highlighted code"""
@ -189,7 +193,7 @@ class IntegrationQuerySet(models.QuerySet):
if cls_replace is None:
return original
new = cls_replace()
for k, v in original.__dict__.items():
for k, v in list(original.__dict__.items()):
new.__dict__[k] = v
return new
@ -261,7 +265,7 @@ class GitHubWebhook(Integration):
integration_type_id = Integration.GITHUB_WEBHOOK
has_sync = True
class Meta:
class Meta(object):
proxy = True
@property
@ -277,7 +281,7 @@ class BitbucketWebhook(Integration):
integration_type_id = Integration.BITBUCKET_WEBHOOK
has_sync = True
class Meta:
class Meta(object):
proxy = True
@property
@ -293,7 +297,7 @@ class GenericAPIWebhook(Integration):
integration_type_id = Integration.API_WEBHOOK
has_sync = False
class Meta:
class Meta(object):
proxy = True
def save(self, *args, **kwargs):

View File

@ -7,6 +7,7 @@ displayed on the site.
"""
from __future__ import absolute_import
from builtins import object
from django.conf import settings
from django.http import HttpRequest
from django.utils.module_loading import import_string

View File

@ -1,6 +1,7 @@
"""Support for templating of notifications."""
from __future__ import absolute_import
from builtins import object
from django.conf import settings
from django.template import Template, Context
from django.template.loader import render_to_string

View File

@ -1,6 +1,7 @@
"""OAuth service models"""
from __future__ import absolute_import
from builtins import object
import json
from django.db import models
@ -114,7 +115,7 @@ class RemoteRepository(models.Model):
objects = RemoteRepositoryQuerySet.as_manager()
class Meta:
class Meta(object):
ordering = ['organization__name', 'name']
verbose_name_plural = 'remote repositories'

View File

@ -1,6 +1,8 @@
"""OAuth utility functions"""
from __future__ import absolute_import
from builtins import str
from builtins import object
import logging
from datetime import datetime

View File

@ -1,6 +1,7 @@
"""OAuth utility functions"""
from __future__ import absolute_import
from builtins import str
import logging
import json
import re

View File

@ -1,6 +1,7 @@
"""OAuth utility functions"""
from __future__ import absolute_import
from builtins import str
import logging
import json
import re

View File

@ -1,6 +1,8 @@
"""Payment forms"""
from __future__ import absolute_import
from builtins import str
from builtins import object
import logging
from stripe.resource import Customer, Charge
@ -27,7 +29,7 @@ class StripeResourceMixin(object):
pass
return resource.create(**attrs)
else:
for (key, val) in attrs.items():
for (key, val) in list(attrs.items()):
setattr(instance, key, val)
instance.save()
return instance

View File

@ -1,6 +1,7 @@
"""Payment view mixin classes"""
from __future__ import absolute_import
from builtins import object
from django.conf import settings

View File

@ -1,5 +1,6 @@
"""Django Managers and Querysets to apply project privacy restrictions."""
from __future__ import absolute_import
from builtins import object
from django.db import models
from guardian.shortcuts import get_objects_for_user

View File

@ -5,6 +5,7 @@ the local machine.
"""
from __future__ import absolute_import
from builtins import object
import getpass
import logging
import os

View File

@ -95,7 +95,7 @@ def create_profile(request, form_class, success_url=None,
if extra_context is None:
extra_context = {}
context = RequestContext(request)
for key, value in extra_context.items():
for key, value in list(extra_context.items()):
context[key] = callable(value) and value() or value
return render_to_response(template_name,
@ -172,7 +172,7 @@ def edit_profile(request, form_class, success_url=None,
if extra_context is None:
extra_context = {}
context = RequestContext(request)
for key, value in extra_context.items():
for key, value in list(extra_context.items()):
context[key] = callable(value) and value() or value
return render_to_response(template_name, {
@ -244,7 +244,7 @@ def profile_detail(request, username, public_profile_field=None,
if extra_context is None:
extra_context = {}
context = RequestContext(request)
for key, value in extra_context.items():
for key, value in list(extra_context.items()):
context[key] = callable(value) and value() or value
return render_to_response(template_name,

View File

@ -1,8 +1,11 @@
"""Project forms"""
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
from builtins import object
from random import choice
from urlparse import urlparse
from urllib.parse import urlparse
from django import forms
from django.conf import settings
@ -73,7 +76,7 @@ class ProjectBasicsForm(ProjectForm):
"""Form for basic project fields"""
class Meta:
class Meta(object):
model = Project
fields = ('name', 'repo', 'repo_type')
@ -153,7 +156,7 @@ class ProjectExtraForm(ProjectForm):
"""Additional project information form"""
class Meta:
class Meta(object):
model = Project
fields = (
'description',
@ -180,7 +183,7 @@ class ProjectAdvancedForm(ProjectTriggerBuildMixin, ProjectForm):
help_text=_("(Beta) The Python interpreter used to create the virtual "
"environment."))
class Meta:
class Meta(object):
model = Project
fields = (
# Standard build edits
@ -216,7 +219,7 @@ class ProjectAdvancedForm(ProjectTriggerBuildMixin, ProjectForm):
class UpdateProjectForm(ProjectTriggerBuildMixin, ProjectBasicsForm,
ProjectExtraForm):
class Meta:
class Meta(object):
model = Project
fields = (
# Basics
@ -497,7 +500,7 @@ class RedirectForm(forms.ModelForm):
"""Form for project redirects"""
class Meta:
class Meta(object):
model = Redirect
fields = ['redirect_type', 'from_url', 'to_url']
@ -521,7 +524,7 @@ class DomainForm(forms.ModelForm):
project = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta:
class Meta(object):
model = Domain
exclude = ['machine', 'cname', 'count', 'https']
@ -558,7 +561,7 @@ class IntegrationForm(forms.ModelForm):
project = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta:
class Meta(object):
model = Integration
exclude = ['provider_data', 'exchanges']
@ -580,7 +583,7 @@ class ProjectAdvertisingForm(forms.ModelForm):
"""Project promotion opt-out form"""
class Meta:
class Meta(object):
model = Project
fields = ['allow_promos']

View File

@ -2,6 +2,8 @@
from __future__ import unicode_literals, print_function
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
from django.db import models, migrations
import readthedocs.core.validators
@ -10,7 +12,7 @@ import sys
if sys.version_info > (3,):
import urllib.parse as urlparse
else:
import urlparse
import urllib.parse
def migrate_url(apps, schema_editor):

View File

@ -1,6 +1,9 @@
"""Project models"""
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
from builtins import object
import fnmatch
import logging
import sys
@ -39,7 +42,7 @@ if sys.version_info > (3,):
from urllib.parse import urlparse
# pylint: enable=import-error
else:
from urlparse import urlparse
from urllib.parse import urlparse
log = logging.getLogger(__name__)
@ -279,7 +282,7 @@ class Project(models.Model):
objects = ProjectQuerySet.as_manager()
all_objects = models.Manager()
class Meta:
class Meta(object):
ordering = ('slug',)
permissions = (
# Translators: Permission around whether a user can view the
@ -857,7 +860,7 @@ class Notification(models.Model):
related_name='%(class)s_notifications')
objects = RelatedProjectQuerySet.as_manager()
class Meta:
class Meta(object):
abstract = True
@ -902,7 +905,7 @@ class Domain(models.Model):
objects = RelatedProjectQuerySet.as_manager()
class Meta:
class Meta(object):
ordering = ('-canonical', '-machine', 'domain')
def __unicode__(self):

View File

@ -5,6 +5,7 @@ rebuilding documentation.
"""
from __future__ import absolute_import
from builtins import str
import os
import shutil
import json
@ -261,7 +262,7 @@ class UpdateDocsTask(Task):
build = {}
if build_pk:
build = api_v2.build(build_pk).get()
return dict((key, val) for (key, val) in build.items()
return dict((key, val) for (key, val) in list(build.items())
if key not in ['project', 'version', 'resource_uri',
'absolute_uri'])

View File

@ -1,6 +1,7 @@
"""Utility functions used by projects"""
from __future__ import absolute_import
from builtins import object
import fnmatch
import os
import subprocess

View File

@ -1,6 +1,8 @@
"""Project version handling"""
from __future__ import absolute_import
from builtins import range
from builtins import object
import unicodedata
from collections import defaultdict
from packaging.version import Version
@ -45,7 +47,7 @@ class VersionManager(object):
del self._state[to_remove]
def prune_minor(self, num_latest):
for major, minors in self._state.items():
for major, minors in list(self._state.items()):
all_keys = sorted(set(minors.keys()))
minor_keep = []
for __ in range(num_latest):
@ -55,8 +57,8 @@ class VersionManager(object):
del self._state[major][to_remove]
def prune_point(self, num_latest):
for major, minors in self._state.items():
for minor in minors.keys():
for major, minors in list(self._state.items()):
for minor in list(minors.keys()):
try:
self._state[major][minor] = sorted(
set(self._state[major][minor]))[-num_latest:]
@ -66,8 +68,8 @@ class VersionManager(object):
def get_version_list(self):
versions = []
for major_val in self._state.values():
for version_list in major_val.values():
for major_val in list(self._state.values()):
for version_list in list(major_val.values()):
versions.extend(version_list)
versions = sorted(versions)
return [

View File

@ -1,5 +1,6 @@
"""Mix-in classes for project views."""
from __future__ import absolute_import
from builtins import object
import logging
from datetime import datetime, timedelta

View File

@ -1,6 +1,7 @@
"""Mixin classes for project views"""
from __future__ import absolute_import
from builtins import object
from django.shortcuts import get_object_or_404
from readthedocs.projects.models import Project

View File

@ -248,7 +248,7 @@ class ImportWizardView(ProjectSpamMixin, PrivateViewMixin, SessionWizardView):
tags = form_data.pop('tags', [])
for tag in tags:
project.tags.add(tag)
for field, value in form_data.items():
for field, value in list(form_data.items()):
if field in extra_fields:
setattr(project, field, value)
basic_only = True
@ -295,7 +295,7 @@ class ImportDemoView(PrivateViewMixin, View):
messages.success(
request, _('Your demo project is currently being imported'))
else:
for (__, msg) in form.errors.items():
for (__, msg) in list(form.errors.items()):
log.error(msg)
messages.error(request,
_('There was a problem adding the demo project'))

View File

@ -329,7 +329,7 @@ def elastic_project_search(request, project_slug):
if results:
# pre and post 1.0 compat
for num, hit in enumerate(results['hits']['hits']):
for key, val in hit['fields'].items():
for key, val in list(hit['fields'].items()):
if isinstance(val, list):
results['hits']['hits'][num]['fields'][key] = val[0]

View File

@ -1,6 +1,7 @@
"""Django models for the redirects app."""
from __future__ import absolute_import
from builtins import object
from django.db import models
from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
@ -69,7 +70,7 @@ class Redirect(models.Model):
objects = RedirectManager()
class Meta:
class Meta(object):
verbose_name = _('redirect')
verbose_name_plural = _('redirects')
ordering = ('-update_dt',)

View File

@ -1,4 +1,5 @@
from __future__ import absolute_import
from builtins import object
from rest_framework import serializers
from readthedocs.builds.models import Build, BuildCommandResult, Version
@ -9,7 +10,7 @@ from readthedocs.oauth.models import RemoteOrganization, RemoteRepository
class ProjectSerializer(serializers.ModelSerializer):
canonical_url = serializers.ReadOnlyField(source='get_docs_url')
class Meta:
class Meta(object):
model = Project
fields = (
'id',
@ -26,7 +27,7 @@ class VersionSerializer(serializers.ModelSerializer):
project = ProjectSerializer()
downloads = serializers.DictField(source='get_downloads', read_only=True)
class Meta:
class Meta(object):
model = Version
fields = (
'id',
@ -40,7 +41,7 @@ class VersionSerializer(serializers.ModelSerializer):
class BuildCommandSerializer(serializers.ModelSerializer):
run_time = serializers.ReadOnlyField()
class Meta:
class Meta(object):
model = BuildCommandResult
exclude = ('')
@ -52,7 +53,7 @@ class BuildSerializer(serializers.ModelSerializer):
commands = BuildCommandSerializer(many=True, read_only=True)
state_display = serializers.ReadOnlyField(source='get_state_display')
class Meta:
class Meta(object):
model = Build
exclude = ('builder',)
@ -61,7 +62,7 @@ class BuildSerializerFull(BuildSerializer):
"""Writeable Build instance serializer, for admin access by builders"""
class Meta:
class Meta(object):
model = Build
exclude = ('')
@ -76,7 +77,7 @@ class SearchIndexSerializer(serializers.Serializer):
class DomainSerializer(serializers.ModelSerializer):
project = ProjectSerializer()
class Meta:
class Meta(object):
model = Domain
fields = (
'id',
@ -90,7 +91,7 @@ class DomainSerializer(serializers.ModelSerializer):
class RemoteOrganizationSerializer(serializers.ModelSerializer):
class Meta:
class Meta(object):
model = RemoteOrganization
exclude = ('json', 'email', 'users')
@ -102,7 +103,7 @@ class RemoteRepositorySerializer(serializers.ModelSerializer):
organization = RemoteOrganizationSerializer()
matches = serializers.SerializerMethodField()
class Meta:
class Meta(object):
model = RemoteRepository
exclude = ('json', 'users')

View File

@ -1,4 +1,5 @@
from __future__ import absolute_import
from builtins import object
import json
import logging

View File

@ -1,5 +1,6 @@
"""Base classes and mixins for unit tests."""
from __future__ import absolute_import
from builtins import object
import os
import shutil
import logging
@ -105,7 +106,7 @@ class WizardTestCase(RequestFactoryTestMixin, TestCase):
try:
data = dict(
('{0}-{1}'.format(step, k), v)
for (k, v) in self.step_data[step].items()
for (k, v) in list(self.step_data[step].items())
)
except KeyError:
pass

View File

@ -1,5 +1,6 @@
# pylint: disable=missing-docstring
from __future__ import absolute_import
from builtins import object
import mock

View File

@ -1,5 +1,6 @@
"""Mock versions of many API-related classes."""
from __future__ import absolute_import
from builtins import object
from contextlib import contextmanager
import json
import mock

View File

@ -1,4 +1,5 @@
from __future__ import absolute_import
from builtins import str
import json
import base64
import datetime

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from builtins import str
import os.path
import shutil
import uuid
@ -271,7 +272,7 @@ class TestBuildCommand(TestCase):
env = {'FOOBAR': 'foobar',
'BIN_PATH': 'foobar'}
cmd = BuildCommand('echo', environment=env)
for key in env.keys():
for key in list(env.keys()):
self.assertEqual(cmd.environment[key], env[key])
def test_result(self):

View File

@ -1,4 +1,5 @@
from __future__ import absolute_import
from builtins import object
from django.test import TestCase, override_settings
from readthedocs.core.utils.extend import (SettingsOverrideObject,

View File

@ -1,4 +1,5 @@
from __future__ import absolute_import
from builtins import range
import django_dynamic_fixture as fixture
from django.test import TestCase, RequestFactory
from django.contrib.contenttypes.models import ContentType

View File

@ -1,7 +1,9 @@
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
import json
import logging
from urllib import urlencode
from urllib.parse import urlencode
import mock
from django_dynamic_fixture import get

View File

@ -1,5 +1,6 @@
from __future__ import absolute_import
from __future__ import print_function
from builtins import object
import re
from django.contrib.admindocs.views import extract_views_from_urlpatterns
@ -61,7 +62,7 @@ class URLAccessMixin(object):
response_attrs.update(response_data)
if self.context_data and getattr(response, 'context'):
self._test_context(response)
for (key, val) in response_attrs.items():
for (key, val) in list(response_attrs.items()):
resp_val = getattr(response, key)
self.assertEqual(
resp_val,
@ -83,7 +84,7 @@ class URLAccessMixin(object):
self.context_data.append(self.pip)
"""
for key in response.context.keys():
for key in list(response.context.keys()):
obj = response.context[key]
for not_obj in self.context_data:
if isinstance(obj, list) or isinstance(obj, set) or isinstance(obj, tuple):
@ -98,7 +99,7 @@ class URLAccessMixin(object):
added_kwargs = {}
for (view, regex, namespace, name) in deconstructed_urls:
request_data = self.request_data.get(name, {}).copy()
for key in re.compile(regex).groupindex.keys():
for key in list(re.compile(regex).groupindex.keys()):
if key in list(request_data.keys()):
added_kwargs[key] = request_data[key]
continue

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from builtins import object
import os
import shutil
import tempfile
@ -93,7 +94,7 @@ class TempSiterootCase(object):
new_callable=mock.PropertyMock
),
}
self.patches = dict((key, mock.start()) for (key, mock) in self.mocks.items())
self.patches = dict((key, mock.start()) for (key, mock) in list(self.mocks.items()))
self.patches['PublicSymlinkBase.CNAME_ROOT'].return_value = os.path.join(
settings.SITE_ROOT, 'public_cname_root'
)

View File

@ -44,7 +44,7 @@ class TestProfileMiddleware(RequestFactoryTestMixin, TestCase):
self.data = {}
for key in data:
self.data.update({('{0}-{1}'.format(key, k), v)
for (k, v) in data[key].items()})
for (k, v) in list(data[key].items())})
self.data['{0}-current_step'.format(self.wizard_class_slug)] = 'extra'
def test_profile_middleware_no_profile(self):
@ -108,7 +108,7 @@ class TestBasicsForm(WizardTestCase):
proj = Project.objects.get(name='foobar')
self.assertIsNotNone(proj)
for (key, val) in self.step_data['basics'].items():
for (key, val) in list(self.step_data['basics'].items()):
self.assertEqual(getattr(proj, key), val)
self.assertEqual(proj.documentation_type, 'sphinx')
@ -170,7 +170,7 @@ class TestAdvancedForm(TestBasicsForm):
[u'bar', u'baz', u'foo']
)
data.update(self.step_data['extra'])
for (key, val) in data.items():
for (key, val) in list(data.items()):
self.assertEqual(getattr(proj, key), val)
def test_form_missing_extra(self):

View File

@ -15,6 +15,7 @@ TODO: Handle page removal case in Page.
"""
from __future__ import absolute_import
from builtins import object
import datetime
from elasticsearch import Elasticsearch, exceptions

View File

@ -2,6 +2,8 @@
"""Functions related to converting content into dict/JSON structures."""
from __future__ import absolute_import
from builtins import next
from builtins import range
import codecs
import fnmatch
import json

View File

@ -2,6 +2,8 @@
"""Utilities related to reading and generating indexable search content."""
from __future__ import absolute_import
from builtins import next
from builtins import range
import os
import fnmatch
import re

View File

@ -47,7 +47,7 @@ def elastic_search(request):
if results:
# pre and post 1.0 compat
for num, hit in enumerate(results['hits']['hits']):
for key, val in hit['fields'].items():
for key, val in list(hit['fields'].items()):
if isinstance(val, list):
results['hits']['hits'][num]['fields'][key] = val[0]

View File

@ -1,5 +1,7 @@
"""Bazaar-related utilities."""
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
import csv
import re
import sys
@ -10,7 +12,7 @@ from readthedocs.vcs_support.base import BaseVCS, VCSVersion
if sys.version_info > (3,):
from io import StringIO
else:
from StringIO import StringIO
from io import StringIO
class Backend(BaseVCS):

View File

@ -1,5 +1,7 @@
"""Git-related utilities."""
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
import re
import logging
import csv
@ -12,7 +14,7 @@ from readthedocs.vcs_support.base import BaseVCS, VCSVersion
if sys.version_info > (3,):
from io import StringIO
else:
from StringIO import StringIO
from io import StringIO
log = logging.getLogger(__name__)

View File

@ -1,5 +1,7 @@
"""Subversion-related utilities."""
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
import csv
import sys
@ -9,7 +11,7 @@ from readthedocs.vcs_support.base import BaseVCS, VCSVersion
if sys.version_info > (3,):
from io import StringIO
else:
from StringIO import StringIO
from io import StringIO
class Backend(BaseVCS):

View File

@ -1,5 +1,6 @@
"""Base classes for VCS backends."""
from __future__ import absolute_import
from builtins import object
import logging
import os
import shutil

View File

@ -1,5 +1,6 @@
"""Locking utilities."""
from __future__ import absolute_import
from builtins import object
import logging
import os
import time

View File

@ -10,6 +10,7 @@ mkdocs==0.14.0
readthedocs-build==2.0.6
django==1.9.12
six==1.10.0
future==0.16.0
django-tastypie==0.13.0
django-haystack==2.6.0