Skip to content
Open
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
135 changes: 135 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
name: CI

on:
push:
pull_request:

jobs:
tests:
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.allow_failure || false }}
strategy:
fail-fast: false
matrix:
python: ["3.9", "3.10", "3.11", "3.12"]
django: ["3.2", "4.2", "5.2"]
db: ["sqlite3", "postgres"]
exclude:
- python: "3.9"
django: "5.2"
db: "sqlite3"
- python: "3.9"
django: "5.2"
db: "postgres"
- python: "3.10"
django: "5.2"
db: "sqlite3"
- python: "3.10"
django: "5.2"
db: "postgres"
- python: "3.11"
django: "5.2"
db: "sqlite3"
- python: "3.11"
django: "5.2"
db: "postgres"
- python: "3.12"
django: "5.2"
db: "sqlite3"
- python: "3.12"
django: "5.2"
db: "postgres"
- python: "3.11"
django: "3.2"
db: "sqlite3"
- python: "3.11"
django: "3.2"
db: "postgres"
- python: "3.12"
django: "3.2"
db: "sqlite3"
- python: "3.12"
django: "3.2"
db: "postgres"
include:
- python: "3.10"
django: "5.2"
db: "sqlite3"
allow_failure: true
- python: "3.10"
django: "5.2"
db: "postgres"
allow_failure: true
- python: "3.11"
django: "5.2"
db: "sqlite3"
allow_failure: true
- python: "3.11"
django: "5.2"
db: "postgres"
allow_failure: true
- python: "3.12"
django: "5.2"
db: "sqlite3"
allow_failure: true
- python: "3.12"
django: "5.2"
db: "postgres"
allow_failure: true
services:
postgres:
image: postgres:15
env:
POSTGRES_DB: daguerre_test
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ""
POSTGRES_HOST_AUTH_METHOD: trust
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U postgres"
--health-interval=10s
--health-timeout=5s
--health-retries=5
env:
DB: ${{ matrix.db }}
DJANGO: ${{ matrix.django }}
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
cache: pip

- name: Install client tools
if: matrix.db == 'postgres'
run: |
sudo apt-get update
sudo apt-get install -y postgresql-client

- name: Install dependencies
run: |
echo "Django version: ${{ matrix.django }}"
pip install .
pip install -r test_project/requirements-${{ matrix.django }}.txt
pip install flake8
if [ "${{ matrix.db }}" = "postgres" ]; then pip install psycopg2-binary==2.9.11; fi

- name: Lint
run: flake8 --ignore=E501,E731,W504 daguerre

- name: Prepare databases
if: matrix.db != 'sqlite3'
run: |
if [ "${{ matrix.db }}" = "postgres" ]; then
until pg_isready -h 127.0.0.1 -U postgres; do sleep 2; done
psql -h 127.0.0.1 -U postgres -c 'drop database if exists daguerre_test;'
psql -h 127.0.0.1 -U postgres -c 'create database daguerre_test;'
fi

- name: Run tests
run: |
cd test_project
./manage.py test --verbosity=2 daguerre
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
/docs/_build/
/dist/
/.env/
.vscode/
49 changes: 22 additions & 27 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,29 @@ dist: xenial
language: python
cache: pip
python:
- "3.5"
- "3.6"
- "3.7"
- "3.8"
- "3.9"
- "3.10"
- "3.11"
- "3.12"
env:
- DB=sqlite3 DJANGO=1.11
- DB=mysql DJANGO=1.11
- DB=postgres DJANGO=1.11
- DB=sqlite3 DJANGO=2.0
- DB=mysql DJANGO=2.0
- DB=postgres DJANGO=2.0
- DB=sqlite3 DJANGO=2.1
- DB=mysql DJANGO=2.1
- DB=postgres DJANGO=2.1
- DB=sqlite3 DJANGO=2.2
- DB=mysql DJANGO=2.2
- DB=postgres DJANGO=2.2
- DB=sqlite3 DJANGO=3.0
- DB=mysql DJANGO=3.0
- DB=postgres DJANGO=3.0
jobs:
exclude:
- python: "3.5"
env: DB=sqlite3 DJANGO=3.0
- python: "3.5"
env: DB=mysql DJANGO=3.0
- python: "3.5"
env: DB=postgres DJANGO=3.0
- DB=sqlite3 DJANGO=3.2
- DB=mysql DJANGO=3.2
- DB=postgres DJANGO=3.2
- DB=sqlite3 DJANGO=4.2
- DB=mysql DJANGO=4.2
- DB=postgres DJANGO=4.2
- DB=sqlite3 DJANGO=5.2
- DB=mysql DJANGO=5.2
- DB=postgres DJANGO=5.2

# jobs:
# exclude:
# - python: "3.5"
# env: DB=sqlite3 DJANGO=3.0
# - python: "3.5"
# env: DB=mysql DJANGO=3.0
# - python: "3.5"
# env: DB=postgres DJANGO=3.0
install:
- pip install . --no-deps
- pip install --no-deps -r test_project/requirements-$DJANGO.txt
Expand Down
2 changes: 1 addition & 1 deletion daguerre/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = (3, 0, 0)
__version__ = (4, 0, 0)
7 changes: 6 additions & 1 deletion daguerre/adjustments.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
from PIL import Image

try:
RESAMPLE_LANCZOS = Image.Resampling.LANCZOS
except AttributeError: # Pillow<9.1
RESAMPLE_LANCZOS = getattr(Image, "LANCZOS", Image.ANTIALIAS)

from daguerre.utils import exif_aware_resize, exif_aware_size


Expand Down Expand Up @@ -128,7 +133,7 @@ def adjust(self, image, areas=None):
# Choose a resize filter based on whether
# we're upscaling or downscaling.
if new_width < image_width:
f = Image.ANTIALIAS
f = RESAMPLE_LANCZOS
else:
f = Image.BICUBIC

Expand Down
6 changes: 6 additions & 0 deletions daguerre/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class DaguerreConfig(AppConfig):
name = 'daguerre'
default_auto_field = 'django.db.models.AutoField'
2 changes: 0 additions & 2 deletions daguerre/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-

import hashlib
import operator
import warnings
Expand Down
Binary file modified daguerre/tests/data/20x7_no_exif.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 10 additions & 10 deletions daguerre/tests/unit/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from django.contrib.auth.models import AnonymousUser
from django.http import Http404
from django.test import RequestFactory
from django.utils.encoding import force_text
from django.utils.encoding import force_str

from daguerre.helpers import AdjustmentHelper
from daguerre.models import Area
Expand Down Expand Up @@ -100,7 +100,7 @@ def test_get__pk(self):

self.assertEqual(response.status_code, 200)
self.assertEqual(response['Content-Type'], "application/json")
data = json.loads(force_text(response.content))
data = json.loads(force_str(response.content))
self.assertEqual(data, area.serialize())

def test_get__pk__wrong(self):
Expand Down Expand Up @@ -128,7 +128,7 @@ def test_get__no_pk(self):

self.assertEqual(response.status_code, 200)
self.assertEqual(response['Content-Type'], "application/json")
data = json.loads(force_text(response.content))
data = json.loads(force_str(response.content))
self.assertEqual(data, [area1.serialize(), area2.serialize()])

def test_post__no_change_perms(self):
Expand All @@ -141,7 +141,7 @@ def test_post__no_change_perms(self):
response = view.post(request)

self.assertEqual(response.status_code, 403)
self.assertEqual(force_text(response.content), '')
self.assertEqual(force_str(response.content), '')

def test_post__invalid_params(self):
area = self.create_area(x2=50, y2=50)
Expand Down Expand Up @@ -200,7 +200,7 @@ def test_post__update(self):
self.assertEqual(response.status_code, 200)
self.assertEqual(response['Content-Type'], "application/json")
self.assertEqual(Area.objects.count(), 1)
data = json.loads(force_text(response.content))
data = json.loads(force_str(response.content))
new_area = Area.objects.get(pk=area.pk, storage_path=area.storage_path)
self.assertEqual(data, new_area.serialize())
self.assertNotEqual(data, old_serialize)
Expand Down Expand Up @@ -234,7 +234,7 @@ def test_post__update__invalid(self):

self.assertEqual(response.status_code, 400)
self.assertEqual(Area.objects.count(), 1)
data = json.loads(force_text(response.content))
data = json.loads(force_str(response.content))
self.assertEqual(list(data.keys()), ['error'])

def test_post__add(self):
Expand Down Expand Up @@ -266,7 +266,7 @@ def test_post__add(self):
self.assertEqual(response.status_code, 200)
self.assertEqual(response['Content-Type'], "application/json")
self.assertEqual(Area.objects.count(), 2)
data = json.loads(force_text(response.content))
data = json.loads(force_str(response.content))
new_area = Area.objects.exclude(pk=area.pk).get()
self.assertEqual(data, new_area.serialize())
del data['storage_path']
Expand Down Expand Up @@ -299,7 +299,7 @@ def test_post__add__no_perms(self):

self.assertEqual(response.status_code, 403)
self.assertEqual(Area.objects.count(), 1)
self.assertEqual(force_text(response.content), '')
self.assertEqual(force_str(response.content), '')

def test_delete__no_perms(self):
area = self.create_area(x2=50, y2=50)
Expand All @@ -319,7 +319,7 @@ def test_delete__no_perms(self):

self.assertEqual(response.status_code, 403)
self.assertEqual(Area.objects.count(), 1)
self.assertEqual(force_text(response.content), '')
self.assertEqual(force_str(response.content), '')

def test_delete__no_pk(self):
area = self.create_area(x2=50, y2=50)
Expand Down Expand Up @@ -356,5 +356,5 @@ def test_delete(self):
response = view.delete(request)

self.assertEqual(response.status_code, 200)
self.assertEqual(force_text(response.content), '')
self.assertEqual(force_str(response.content), '')
self.assertEqual(Area.objects.count(), 0)
27 changes: 18 additions & 9 deletions daguerre/urls.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,26 @@
from django.conf.urls import url
from django.urls import re_path

from daguerre.views import (AdjustedImageRedirectView, AjaxAdjustmentInfoView,
AjaxUpdateAreaView)
from daguerre.views import (
AdjustedImageRedirectView,
AjaxAdjustmentInfoView,
AjaxUpdateAreaView,
)


urlpatterns = [
url(r'^adjust/(?P<storage_path>.+)$',
re_path(
r'^adjust/(?P<storage_path>.+)$',
AdjustedImageRedirectView.as_view(),
name="daguerre_adjusted_image_redirect"),
url(r'^info/(?P<storage_path>.+)$',
name='daguerre_adjusted_image_redirect',
),
re_path(
r'^info/(?P<storage_path>.+)$',
AjaxAdjustmentInfoView.as_view(),
name="daguerre_ajax_adjustment_info"),
url(r'^area/(?P<storage_path>.+?)(?:/(?P<pk>\d+))?$',
name='daguerre_ajax_adjustment_info',
),
re_path(
r'^area/(?P<storage_path>.+?)(?:/(?P<pk>\d+))?$',
AjaxUpdateAreaView.as_view(),
name="daguerre_ajax_update_area"),
name='daguerre_ajax_update_area',
),
]
Loading
Loading