Skip to content

Commit

Permalink
Merge pull request #58 from dimagi/dm/next
Browse files Browse the repository at this point in the history
Cleanup, drop old dependencies, bump version to 1.0.0
  • Loading branch information
millerdev committed Aug 5, 2020
2 parents f94c946 + 4e55fd6 commit ad68ba1
Show file tree
Hide file tree
Showing 20 changed files with 21 additions and 127 deletions.
3 changes: 3 additions & 0 deletions .flake8
@@ -0,0 +1,3 @@
[flake8]
max-line-length = 115
ignore = E128, E265, F403, W503, W1618 # http://pep8.readthedocs.org/en/latest/intro.html#error-codes
6 changes: 0 additions & 6 deletions .travis.yml
@@ -1,12 +1,10 @@
language: python
python:
- "3.4"
- "3.5"
- "3.6"
- "3.7"
- "3.8"
env:
- DJANGO_VERSION_MIN=1.11 DJANGO_VERSION_MAX=2.0
- DJANGO_VERSION_MIN=2.2 DJANGO_VERSION_MAX=3.0
- DJANGO_VERSION_MIN=3.0.3 DJANGO_VERSION_MAX=4.0
install:
Expand All @@ -21,9 +19,5 @@ after_success:

matrix:
exclude:
- python: "3.4"
env: DJANGO_VERSION_MIN=2.2 DJANGO_VERSION_MAX=3.0
- python: "3.4"
env: DJANGO_VERSION_MIN=3.0.3 DJANGO_VERSION_MAX=4.0
- python: "3.5"
env: DJANGO_VERSION_MIN=3.0.3 DJANGO_VERSION_MAX=4.0
3 changes: 1 addition & 2 deletions django_prbac/__init__.py
@@ -1,2 +1 @@
from __future__ import unicode_literals
__version__ = '0.0.8'
__version__ = '1.0.0'
6 changes: 0 additions & 6 deletions django_prbac/admin.py
@@ -1,14 +1,8 @@
# Use modern Python
from __future__ import unicode_literals, absolute_import, print_function

# Django imports
from django import forms
from django.contrib import admin

# External librariess
import simplejson

# Local imports
import django_prbac.csv
from django_prbac.models import *
from django_prbac.forms import StringSetInput
Expand Down
6 changes: 0 additions & 6 deletions django_prbac/arbitrary.py
@@ -1,14 +1,8 @@
# Use modern Python
from __future__ import unicode_literals, absolute_import, print_function

# Standard Library Imports
import uuid
from random import choice

# Django imports
from django.contrib.auth.models import User

# Local Imports
from django_prbac.models import *

__all__ = [
Expand Down
22 changes: 3 additions & 19 deletions django_prbac/csv.py
@@ -1,35 +1,19 @@
# Use Modern Python
from __future__ import unicode_literals, absolute_import, print_function

# System imports
import csv

# External libraries
import six
from io import StringIO


def parse_line(value, quotechar=None, **kwargs):
"""
A simple wrapper to parse a single CSV value
"""

quotechar = quotechar or '"'

if six.PY2:
quotechar = quotechar.encode('utf-8')

for row in csv.reader([value], quotechar=quotechar, **kwargs):
if six.PY3:
return row # Already unicode in Python 3, hooray!
else:
return [s.decode('utf-8') for s in row] # Always binary in Python 2, fooey!
return next(csv.reader([value], quotechar=quotechar, **kwargs), None)


def line_to_string(value, **kwargs):
"""
A simple wrapper to write one CSV line
"""

fh = six.StringIO()
fh = StringIO()
csv.writer(fh, **kwargs).writerow(value)
return fh.getvalue()
4 changes: 0 additions & 4 deletions django_prbac/decorators.py
@@ -1,9 +1,5 @@
# Use modern Python
from __future__ import unicode_literals, absolute_import, print_function

from functools import wraps

# Local Imports
from django.http import Http404
from django_prbac.exceptions import PermissionDenied
from django_prbac.utils import has_privilege
Expand Down
3 changes: 0 additions & 3 deletions django_prbac/exceptions.py
@@ -1,6 +1,3 @@
# Use Modern Python
from __future__ import unicode_literals, absolute_import, print_function


class PermissionDenied(Exception):
pass
14 changes: 3 additions & 11 deletions django_prbac/fields.py
@@ -1,13 +1,5 @@
# Use Modern Python
from __future__ import unicode_literals, absolute_import, print_function

# Django imports
from django.db import models

# External libraries
import six

# Local imports
import django_prbac.csv
from django_prbac.forms import StringListFormField

Expand All @@ -18,7 +10,7 @@ class StringListField(models.TextField):
"""

def is_string_list(self, value):
return isinstance(value, list) and all([isinstance(v, six.string_types) for v in value])
return isinstance(value, list) and all([isinstance(v, str) for v in value])

def to_python(self, value):
"""
Expand All @@ -31,7 +23,7 @@ def to_python(self, value):
# Already the appropriate python type
if self.is_string_list(value):
return value
elif isinstance(value, six.string_types):
elif isinstance(value, str):
return django_prbac.csv.parse_line(value)
else:
raise ValueError('Invalid value for StringListField: %r is neither the correct type nor deserializable' % value)
Expand Down Expand Up @@ -73,7 +65,7 @@ class StringSetField(StringListField):
# TODO thought: If Python had polymorphism this ought be "Serialize a => Field (List a)"

def is_string_set(self, value):
return isinstance(value, set) and all([isinstance(v, six.string_types) for v in value])
return isinstance(value, set) and all([isinstance(v, str) for v in value])

def to_python(self, value):
"""
Expand Down
18 changes: 4 additions & 14 deletions django_prbac/forms.py
@@ -1,21 +1,11 @@
# Use Modern Python
from __future__ import unicode_literals, absolute_import, print_function

# System imports

# Django imports
from django.forms import ValidationError, CharField, TextInput

# External libraries
import six

# Local imports
import django_prbac.csv


class StringListInput(TextInput):
def render(self, name, value, attrs=None):
if isinstance(value, six.string_types):
if isinstance(value, str):
return super(StringListInput, self).render(name, value)
else:
rendered_value = django_prbac.csv.line_to_string(list(value))
Expand All @@ -24,7 +14,7 @@ def render(self, name, value, attrs=None):

class StringSetInput(TextInput):
def render(self, name, value, attrs=None):
if isinstance(value, six.string_types):
if isinstance(value, str):
return super(StringSetInput, self).render(name, value)
else:
rendered_value = django_prbac.csv.line_to_string(sorted(list(value)))
Expand All @@ -43,13 +33,13 @@ def __init__(self, quotechar=None, skipinitialspace=None, *args, **kwargs):
super(StringListFormField, self).__init__(*args, **defaults)

def is_string_list(self, value):
return isinstance(value, list) and all([isinstance(v, six.string_types) for v in value])
return isinstance(value, list) and all([isinstance(v, str) for v in value])

def clean(self, value):
if self.is_string_list(value):
return value

elif not isinstance(value, six.string_types):
elif not isinstance(value, str):
raise ValidationError('%r cannot be converted to a string list' % value)

else:
Expand Down
1 change: 0 additions & 1 deletion django_prbac/mock_settings.py
Expand Up @@ -3,7 +3,6 @@
the admin site.
"""

from __future__ import unicode_literals
SECRET_KEY = 'Not a secret key at all, actually'

DEBUG = True
Expand Down
8 changes: 0 additions & 8 deletions django_prbac/models.py
@@ -1,11 +1,6 @@
# Use modern Python
from __future__ import unicode_literals, absolute_import, print_function

# Standard Library Imports
import time
import weakref

# Django imports
from django import VERSION
from django.db import models
from django.conf import settings
Expand All @@ -15,11 +10,8 @@
def python_2_unicode_compatible(fn):
return fn


# External Library imports
import jsonfield

# Local imports
from django_prbac.fields import StringSetField


Expand Down
5 changes: 0 additions & 5 deletions django_prbac/tests/test_decorators.py
@@ -1,11 +1,6 @@
# Use Modern Python
from __future__ import unicode_literals, absolute_import, print_function

# Django imports
from django.test import TestCase
from django.http import HttpRequest

# Local imports
from django_prbac.decorators import requires_privilege
from django_prbac.exceptions import PermissionDenied
from django_prbac.models import Role
Expand Down
5 changes: 0 additions & 5 deletions django_prbac/tests/test_fields.py
@@ -1,10 +1,5 @@
# Use Modern Python
from __future__ import unicode_literals, absolute_import, print_function

# Django imports
from django.test import TestCase

# Local imports
from django_prbac.fields import StringListField, StringSetField


Expand Down
5 changes: 0 additions & 5 deletions django_prbac/tests/test_forms.py
@@ -1,10 +1,5 @@
# Use Modern Python
from __future__ import unicode_literals, absolute_import, print_function

# Django imports
from django.test import TestCase

# Local imports
from django_prbac.forms import StringListFormField


Expand Down
19 changes: 3 additions & 16 deletions django_prbac/tests/test_models.py
@@ -1,18 +1,7 @@
# Use modern Python
from __future__ import unicode_literals, absolute_import, print_function

# Standard Library Imports

# Django imports
from django.test import TestCase # https://code.djangoproject.com/ticket/20913

# External Library imports

# Local imports
from django_prbac.models import *
from django_prbac.models import Role
from django_prbac import arbitrary
from six.moves import range
from six.moves import zip


class TestRole(TestCase):
Expand Down Expand Up @@ -73,7 +62,6 @@ def test_has_permission_far_transitive_no_params(self):
self.assertTrue(subrole.instantiate({}).has_privilege(superrole1.instantiate({})))
self.assertFalse(subrole.instantiate({}).has_privilege(superrole2.instantiate({})))


def test_has_permission_immediate_params(self):
subrole = arbitrary.role()
superrole1 = arbitrary.role(parameters=set(['one']))
Expand All @@ -82,7 +70,6 @@ def test_has_permission_immediate_params(self):
self.assertTrue(subrole.instantiate({}).has_privilege(superrole1.instantiate(dict(one='foo'))))
self.assertFalse(subrole.instantiate({}).has_privilege(superrole1.instantiate(dict(one='baz'))))


def test_unsaved_role_does_not_have_permission(self):
role1 = Role()
role2 = arbitrary.role()
Expand All @@ -102,8 +89,8 @@ def test_instantiated_to_role_smoke_test(self):
parameters = ['one']

superrole = arbitrary.role(parameters=parameters)
grant = arbitrary.grant(to_role=superrole, assignment={'one':'hello'})
self.assertEqual(grant.instantiated_to_role({}).assignment, {'one':'hello'})
grant = arbitrary.grant(to_role=superrole, assignment={'one': 'hello'})
self.assertEqual(grant.instantiated_to_role({}).assignment, {'one': 'hello'})

grant = arbitrary.grant(to_role=superrole, assignment={'two': 'goodbye'})
self.assertEqual(grant.instantiated_to_role({}).assignment, {})
Expand Down
3 changes: 0 additions & 3 deletions django_prbac/urls.py
@@ -1,6 +1,3 @@

from __future__ import absolute_import
from __future__ import unicode_literals
from django.conf.urls import url
from django.contrib import admin

Expand Down
3 changes: 0 additions & 3 deletions django_prbac/utils.py
@@ -1,8 +1,5 @@
# Use modern Python
from __future__ import unicode_literals, absolute_import, print_function
import warnings

# Local Imports
from django_prbac.exceptions import PermissionDenied
from django_prbac.models import Role, UserRole

Expand Down
2 changes: 0 additions & 2 deletions docs/conf.py
Expand Up @@ -11,8 +11,6 @@
# All configuration values have a default; values that are commented out
# serve to show the default.

from __future__ import absolute_import
from __future__ import unicode_literals
import sys, os, re
from io import open

Expand Down
12 changes: 4 additions & 8 deletions setup.py
@@ -1,5 +1,3 @@
from __future__ import absolute_import
from __future__ import unicode_literals
import os
import re
from io import open
Expand Down Expand Up @@ -32,12 +30,11 @@ def get_readme():
packages=find_packages(),
zip_safe=False,
install_requires=[
# avoid django 1 <1.11.28 and django 2 <2.2.10 and django 3 < 3.0.3
# avoid django 2 <2.2.10 and django 3 < 3.0.3
# https://github.com/advisories/GHSA-hmr4-m2h5-33qx
'django>=1.11.28,!=2.0.*,!=2.1.*,!=2.2.0,!=2.2.1,!=2.2.2,!=2.2.3,!=2.2.4,!=2.2.5,!=2.2.6,!=2.2.7,!=2.2.8,!=2.2.9,!=3.0.0,!=3.0.1,!=3.0.2,<4',
'django>=2.2.10,!=3.0.0,!=3.0.1,!=3.0.2,<4',
'jsonfield>=1.0.3,<3',
'simplejson',
'six',
],
classifiers=[
'Development Status :: 3 - Alpha',
Expand All @@ -47,12 +44,11 @@ def get_readme():
'License :: OSI Approved :: BSD License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'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',
'Topic :: Software Development :: Libraries :: Python Modules',
],
options={"bdist_wheel": {"universal": "1"}},
Expand Down

0 comments on commit ad68ba1

Please sign in to comment.