Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: remove support for python 2.7, add support for Python 3.9 & Django 3.1, 3.2 #265

Merged
merged 4 commits into from
Nov 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 0 additions & 36 deletions .travis.yml

This file was deleted.

2 changes: 0 additions & 2 deletions braces/views/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import absolute_import

from ._access import (
AnonymousRequiredMixin,
GroupRequiredMixin,
Expand Down
11 changes: 3 additions & 8 deletions braces/views/_access.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,9 @@
from django.http import (HttpResponseRedirect, HttpResponsePermanentRedirect,
Http404, HttpResponse, StreamingHttpResponse)
from django.shortcuts import resolve_url
try:
from django.utils.encoding import force_str as force_string
except ImportError:
from django.utils.encoding import force_text as force_string
from django.utils.encoding import force_str
from django.utils.timezone import now

import six


class AccessMixin(object):
"""
Expand All @@ -38,7 +33,7 @@ def get_login_url(self):
'Define {0}.login_url or settings.LOGIN_URL or override '
'{0}.get_login_url().'.format(self.__class__.__name__))

return force_string(login_url)
return force_str(login_url)

def get_redirect_field_name(self):
"""
Expand Down Expand Up @@ -316,7 +311,7 @@ class GroupRequiredMixin(AccessMixin):
def get_group_required(self):
if self.group_required is None or (
not isinstance(self.group_required,
(list, tuple) + six.string_types)
(list, tuple, str))
):

raise ImproperlyConfigured(
Expand Down
6 changes: 1 addition & 5 deletions braces/views/_ajax.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
from __future__ import unicode_literals

import json
from django.core import serializers
from django.core.exceptions import ImproperlyConfigured
from django.core.serializers.json import DjangoJSONEncoder
from django.http import HttpResponse, HttpResponseBadRequest

import six


class JSONResponseMixin(object):
"""
Expand All @@ -21,7 +17,7 @@ class JSONResponseMixin(object):
def get_content_type(self):
if (self.content_type is not None and
not isinstance(self.content_type,
(six.string_types, six.text_type))):
str)):
raise ImproperlyConfigured(
'{0} is missing a content type. Define {0}.content_type, '
'or override {0}.get_content_type().'.format(
Expand Down
19 changes: 6 additions & 13 deletions braces/views/_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,11 @@
from django.contrib import messages
from django.core.exceptions import ImproperlyConfigured
from django.utils.decorators import method_decorator
try:
from django.utils.encoding import force_str as force_string
except ImportError:
from django.utils.encoding import force_text as force_string
from django.utils.encoding import force_str
from django.utils.functional import Promise
from django.views.decorators.csrf import csrf_exempt
try:
from django.urls import reverse
except ImportError:
from django.core.urlresolvers import reverse
from django.urls import reverse

import six


class CsrfExemptMixin(object):
Expand Down Expand Up @@ -121,13 +114,13 @@ def get_form_valid_message(self):
)

if not isinstance(self.form_valid_message,
(six.string_types, six.text_type, Promise)):
(str, Promise)):
raise ImproperlyConfigured(
'{0}.form_valid_message must be a str or unicode '
'object.'.format(self.__class__.__name__)
)

return force_string(self.form_valid_message)
return force_str(self.form_valid_message)

def form_valid(self, form):
"""
Expand Down Expand Up @@ -167,12 +160,12 @@ def get_form_invalid_message(self):
self.__class__.__name__))

if not isinstance(self.form_invalid_message,
(six.string_types, six.text_type, Promise)):
(str, Promise)):
raise ImproperlyConfigured(
'{0}.form_invalid_message must be a str or unicode '
'object.'.format(self.__class__.__name__))

return force_string(self.form_invalid_message)
return force_str(self.form_invalid_message)

def form_invalid(self, form):
response = super(FormInvalidMessageMixin, self).form_invalid(form)
Expand Down
12 changes: 3 additions & 9 deletions braces/views/_other.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
from django.core.exceptions import ImproperlyConfigured
from django.shortcuts import redirect
try:
from django.utils.encoding import force_str as force_string
except ImportError:
from django.utils.encoding import force_text as force_string
try:
from django.urls import resolve
except ImportError:
from django.core.urlresolvers import resolve
from django.utils.encoding import force_str
from django.urls import resolve


class SetHeadlineMixin(object):
Expand All @@ -31,7 +25,7 @@ def get_headline(self):
'{0} is missing a headline. '
'Define {0}.headline, or override '
'{0}.get_headline().'.format(self.__class__.__name__))
return force_string(self.headline)
return force_str(self.headline)


class StaticContextMixin(object):
Expand Down
4 changes: 2 additions & 2 deletions requirements-docs.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
sphinx==1.7.9
sphinx==1.8.5
releases
semantic-version==2.6
semantic-version==2.8.5
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 1.14.0
current_version = 1.15.0
commit = True
tag = True

Expand Down
42 changes: 34 additions & 8 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,35 @@
import os
import re
from setuptools import setup

import braces
NAME = 'braces'

def _add_default(m):
attr_name, attr_value = m.groups()
return ((attr_name, attr_value.strip("\"'")),)


def parse_dist_meta():
"""Extract metadata information from ``$dist/__init__.py``."""

re_meta = re.compile(r'__(\w+?)__\s*=\s*(.*)')
re_doc = re.compile(r'^"""(.+?)"""')
here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, NAME, '__init__.py')) as meta_fh:
distmeta = {}
for line in meta_fh:
if line.strip() == '# -eof meta-':
break
match = re_meta.match(line.strip())
if match:
distmeta.update(_add_default(match))
return distmeta

meta = parse_dist_meta()

setup(
name="django-braces",
version=braces.__version__,
version=meta['version'],
description="Reusable, generic mixins for Django",
long_description="Mixins to add easy functionality to Django class-based views, forms, and models.",
keywords="django, views, forms, mixins",
Expand All @@ -21,16 +46,17 @@
"License :: OSI Approved :: BSD License",
"Environment :: Web Environment",
"Development Status :: 5 - Production/Stable",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Framework :: Django",
"Framework :: Django :: 1.11",
"Framework :: Django :: 2.0"
"Framework :: Django :: 2.2"
"Framework :: Django :: 3.1"
"Framework :: Django :: 3.2"
],
install_requires=[
"Django>=1.11.0",
"six"
"Django>=2.2"
],
)
25 changes: 0 additions & 25 deletions tests/compat.py

This file was deleted.

2 changes: 0 additions & 2 deletions tests/factories.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import absolute_import

import factory

from django.contrib.auth.models import Group, Permission, User
Expand Down
2 changes: 0 additions & 2 deletions tests/forms.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import absolute_import

from django import forms

from braces.forms import UserKwargModelFormMixin
Expand Down
Loading