Merge pull request #125 from jazzband/add-3.10

Add support for Python 3.10
This commit is contained in:
Michał Pasternak 2022-08-08 00:25:12 +02:00 committed by GitHub
commit 8e8b76fc0a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 60 additions and 51 deletions

View file

@ -11,14 +11,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: 3.8
python-version: "3.10"
- name: Install dependencies
run: |

View file

@ -9,13 +9,13 @@ jobs:
fail-fast: false
max-parallel: 5
matrix:
python-version: ['3.6', '3.7', '3.8', '3.9']
python-version: ['3.7', '3.8', '3.9', '3.10', '3.11-dev']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
@ -25,7 +25,7 @@ jobs:
echo "::set-output name=dir::$(pip cache dir)"
- name: Cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: ${{ steps.pip-cache.outputs.dir }}
key:
@ -43,6 +43,6 @@ jobs:
tox -v
- name: Upload coverage
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v2
with:
name: Python ${{ matrix.python-version }}

15
.pre-commit-config.yaml Normal file
View file

@ -0,0 +1,15 @@
repos:
- repo: https://github.com/asottile/pyupgrade
rev: v2.34.0
hooks:
- id: pyupgrade
args: [--py37-plus]
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0
hooks:
- id: check-merge-conflict
- id: check-yaml
ci:
autoupdate_schedule: quarterly

View file

@ -35,8 +35,8 @@ class CodeMirrorTextArea(forms.Textarea):
def render(self, name, value, attrs=None, renderer=None):
result = []
result.append(
super(CodeMirrorTextArea, self).render(name, value, attrs))
result.append(u"""
super().render(name, value, attrs))
result.append("""
<script type="text/javascript">
var editor = CodeMirror.fromTextArea('id_%(name)s', {
path: "%(media_prefix)sjs/",
@ -50,7 +50,7 @@ class CodeMirrorTextArea(forms.Textarea):
});
</script>
""" % dict(media_prefix=settings.DBTEMPLATES_MEDIA_PREFIX, name=name))
return mark_safe(u"".join(result))
return mark_safe("".join(result))
if settings.DBTEMPLATES_USE_CODEMIRROR:
@ -144,7 +144,7 @@ class TemplateAdmin(TemplateModelAdmin):
for template in queryset:
valid, error = check_template_syntax(template)
if not valid:
errors.append('%s: %s' % (template.name, error))
errors.append(f'{template.name}: {error}')
if errors:
count = len(errors)
message = ungettext(

View file

@ -33,7 +33,7 @@ class Loader(BaseLoader):
def _load_and_store_template(self, template_name, cache_key, site, **params):
template = Template.objects.get(name__exact=template_name, **params)
db = router.db_for_read(Template, instance=template)
display_name = 'dbtemplates:%s:%s:%s' % (db, template_name, site.domain)
display_name = f'dbtemplates:{db}:{template_name}:{site.domain}'
return set_and_return(cache_key, template.content, display_name)
def _load_template_source(self, template_name, template_dirs=None):

View file

@ -12,7 +12,7 @@ class Command(BaseCommand):
for template in Template.objects.all():
valid, error = check_template_syntax(template)
if not valid:
errors.append('%s: %s' % (template.name, error))
errors.append(f'{template.name}: {error}')
if errors:
raise CommandError(
'Some templates contained errors\n%s' % '\n'.join(errors))

View file

@ -43,7 +43,7 @@ class Command(BaseCommand):
verbosity = int(options.get('verbosity', 1))
for error_code in (404, 500):
template, created = Template.objects.get_or_create(
name="%s.html" % error_code)
name=f"{error_code}.html")
if created or (not created and force):
template.content = TEMPLATES.get(error_code, '')
template.save()

View file

@ -1,4 +1,3 @@
import io
import os
from django.contrib.sites.models import Site
from django.core.management.base import CommandError, BaseCommand
@ -53,7 +52,7 @@ class Command(BaseCommand):
delete = options.get('delete')
if not extension.startswith("."):
extension = ".%s" % extension
extension = f".{extension}"
try:
site = Site.objects.get_current()
@ -84,7 +83,7 @@ class Command(BaseCommand):
"database.\nCreate it with '%s'?"
" (y/[n]): """ % (name, path))
if force or confirm.lower().startswith('y'):
with io.open(path, encoding='utf-8') as f:
with open(path, encoding='utf-8') as f:
t = Template(name=name, content=f.read())
t.save()
t.sites.add(site)
@ -102,7 +101,7 @@ class Command(BaseCommand):
if confirm in ('', FILES_TO_DATABASE,
DATABASE_TO_FILES):
if confirm == FILES_TO_DATABASE:
with io.open(path, encoding='utf-8') as f:
with open(path, encoding='utf-8') as f:
t.content = f.read()
t.save()
t.sites.add(site)
@ -111,9 +110,9 @@ class Command(BaseCommand):
os.remove(path)
except OSError:
raise CommandError(
u"Couldn't delete %s" % path)
f"Couldn't delete {path}")
elif confirm == DATABASE_TO_FILES:
with io.open(path, 'w', encoding='utf-8') as f:
with open(path, 'w', encoding='utf-8') as f:
f.write(t.content)
if delete:
t.delete()

View file

@ -1,6 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import django
from django.db import models, migrations
import django.utils.timezone

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from dbtemplates.conf import settings
from dbtemplates.utils.cache import (add_template_to_cache,
remove_cached_template)
@ -20,7 +19,7 @@ class Template(models.Model):
name = models.CharField(_('name'), max_length=100,
help_text=_("Example: 'flatpages/default.html'"))
content = models.TextField(_('content'), blank=True)
sites = models.ManyToManyField(Site, verbose_name=_(u'sites'),
sites = models.ManyToManyField(Site, verbose_name=_('sites'),
blank=True)
creation_date = models.DateTimeField(_('creation date'),
default=now)
@ -59,7 +58,7 @@ class Template(models.Model):
# populate the template instance with its content.
if settings.DBTEMPLATES_AUTO_POPULATE_CONTENT and not self.content:
self.populate()
super(Template, self).save(*args, **kwargs)
super().save(*args, **kwargs)
def add_default_site(instance, **kwargs):

View file

@ -1,4 +1,3 @@
import io
import os
import shutil
import tempfile
@ -103,9 +102,9 @@ class DbTemplatesTestCase(TestCase):
old_template_dirs = settings.TEMPLATES[0].get('DIRS', [])
temp_template_dir = tempfile.mkdtemp('dbtemplates')
temp_template_path = os.path.join(temp_template_dir, 'temp_test.html')
temp_template = io.open(temp_template_path, 'w', encoding='utf-8')
temp_template = open(temp_template_path, 'w', encoding='utf-8')
try:
temp_template.write(u'temp test')
temp_template.write('temp test')
settings.TEMPLATES[0]['DIRS'] = (temp_template_dir,)
# these works well if is not settings patched at runtime
# for supporting django < 1.7 tests we must patch dirs in runtime
@ -120,12 +119,12 @@ class DbTemplatesTestCase(TestCase):
Template.objects.filter(name='temp_test.html').exists())
t = Template.objects.get(name='temp_test.html')
t.content = u'temp test modified'
t.content = 'temp test modified'
t.save()
call_command('sync_templates', force=True,
verbosity=0, overwrite=DATABASE_TO_FILES)
self.assertEqual(u'temp test modified',
io.open(temp_template_path,
self.assertEqual('temp test modified',
open(temp_template_path,
encoding='utf-8').read())
call_command('sync_templates', force=True, verbosity=0,

View file

@ -28,7 +28,7 @@ cache = get_cache_backend()
def get_cache_key(name):
current_site = Site.objects.get_current()
return 'dbtemplates::%s::%s' % (slugify(name), current_site.pk)
return f'dbtemplates::{slugify(name)}::{current_site.pk}'
def get_cache_notfound_key(name):

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
#
# django-dbtemplates documentation build configuration file, created by
# sphinx-quickstart on Fri Oct 9 14:52:11 2009.
@ -37,8 +36,8 @@ source_suffix = '.txt'
master_doc = 'index'
# General information about the project.
project = u'django-dbtemplates'
copyright = u'2007-2019, Jannis Leidel and contributors'
project = 'django-dbtemplates'
copyright = '2007-2019, Jannis Leidel and contributors'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@ -177,8 +176,8 @@ htmlhelp_basename = 'django-dbtemplatesdoc'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'django-dbtemplates.tex', u'django-dbtemplates Documentation',
u'Jannis Leidel and contributors', 'manual'),
('index', 'django-dbtemplates.tex', 'django-dbtemplates Documentation',
'Jannis Leidel and contributors', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of

View file

@ -2,6 +2,3 @@
source-dir = docs/
build-dir = docs/_build
all_files = 1
[bdist_wheel]
universal=1

View file

@ -5,7 +5,7 @@ from setuptools import setup, find_packages
def read(*parts):
filename = os.path.join(os.path.dirname(__file__), *parts)
with io.open(filename, encoding="utf-8") as fp:
with open(filename, encoding="utf-8") as fp:
return fp.read()
@ -27,6 +27,7 @@ setup(
"static/dbtemplates/js/*.js",
],
},
python_requires=">=3.7",
classifiers=[
"Development Status :: 5 - Production/Stable",
"Environment :: Web Environment",
@ -35,10 +36,11 @@ setup(
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Framework :: Django",
],
install_requires=["django-appconf >= 0.4"],

14
tox.ini
View file

@ -4,22 +4,24 @@ usedevelop = True
minversion = 1.8
envlist =
flake8
py3{6,7,8,9}-dj22
py3{6,7,8,9}-dj32
py3{7,8,9}-dj22
py3{7,8,9,10,11}-dj32
[gh-actions]
python =
3.6: py36
3.7: py37
3.8: py38, flake8
3.8: py38
3.9: py39
3.10: py310, flake8
3.11: py311
[testenv]
basepython =
py36: python3.6
py37: python3.7
py38: python3.8
py39: python3.9
py310: python3.10
py311: python3.11
usedevelop = true
setenv =
DJANGO_SETTINGS_MODULE = dbtemplates.test_settings
@ -36,7 +38,7 @@ commands =
coverage xml
[testenv:flake8]
basepython = python3.9
basepython = python3.10
commands = flake8 dbtemplates
deps = flake8