diff -rc '-ICopyright (c)' '-I#Copyright ' -I#copyright '-I\$Header:' '-I\$Id:' '-I\$Revision:' '-I\$Date:' '-I\$HeadURL:' -I#history -xEntries -x.svn '-x*.pdf' '-x*.pyc' -x__pycache__ -x.git -x.hg django-betterforms-1.2/betterforms/changelist.py rl-django-betterforms-2.0.0/betterforms/changelist.py *** django-betterforms-1.2/betterforms/changelist.py 2018-07-03 16:24:41.000000000 +0100 --- rl-django-betterforms-2.0.0/betterforms/changelist.py 2020-07-21 10:46:11.000000000 +0100 *************** *** 5,12 **** from django.core.exceptions import ValidationError, ImproperlyConfigured from django.db.models import Q from collections import OrderedDict ! from django.utils import six ! from django.utils.six.moves import reduce from django.utils.http import urlencode from .forms import BetterForm --- 5,11 ---- from django.core.exceptions import ValidationError, ImproperlyConfigured from django.db.models import Q from collections import OrderedDict ! from functools import reduce from django.utils.http import urlencode from .forms import BetterForm *************** *** 229,235 **** return False try: return all(( ! isinstance(header[0], six.string_types), isinstance(header[1], dict), )) except (IndexError, KeyError): --- 228,234 ---- return False try: return all(( ! isinstance(header[0], str), isinstance(header[1], dict), )) except (IndexError, KeyError): *************** *** 247,253 **** for header in headers: if isinstance(header, Header): self.headers[header.name] = header ! elif isinstance(header, six.string_types): self.headers[header] = self.HeaderClass(header) elif is_header_kwargs(header): header_name, header_kwargs = header --- 246,252 ---- for header in headers: if isinstance(header, Header): self.headers[header.name] = header ! elif isinstance(header, str): self.headers[header] = self.HeaderClass(header) elif is_header_kwargs(header): header_name, header_kwargs = header diff -rc '-ICopyright (c)' '-I#Copyright ' -I#copyright '-I\$Header:' '-I\$Id:' '-I\$Revision:' '-I\$Date:' '-I\$HeadURL:' -I#history -xEntries -x.svn '-x*.pdf' '-x*.pyc' -x__pycache__ -x.git -x.hg django-betterforms-1.2/betterforms/forms.py rl-django-betterforms-2.0.0/betterforms/forms.py *** django-betterforms-1.2/betterforms/forms.py 2018-07-03 16:24:41.000000000 +0100 --- rl-django-betterforms-2.0.0/betterforms/forms.py 2020-07-21 12:17:52.000000000 +0100 *************** *** 1,11 **** ! import collections from django import forms from django.forms.utils import ErrorDict from django.core.exceptions import NON_FIELD_ERRORS from django.template.loader import render_to_string - from django.utils import six - from django.utils.encoding import python_2_unicode_compatible class CSSClassMixin(object): --- 1,10 ---- ! from collections import Counter, OrderedDict ! from collections.abc import Iterable from django import forms from django.forms.utils import ErrorDict from django.core.exceptions import NON_FIELD_ERRORS from django.template.loader import render_to_string class CSSClassMixin(object): *************** *** 50,57 **** def process_fieldset_row(fields, fieldset_class, base_name): for index, row in enumerate(fields): ! if not isinstance(row, (six.string_types, Fieldset)): ! if len(row) == 2 and isinstance(row[0], six.string_types) and isinstance(row[1], dict): row = fieldset_class(row[0], **row[1]) else: row = fieldset_class("{0}_{1}".format(base_name, index), fields=row) --- 49,56 ---- def process_fieldset_row(fields, fieldset_class, base_name): for index, row in enumerate(fields): ! if not isinstance(row, (str, Fieldset)): ! if len(row) == 2 and isinstance(row[0], str) and isinstance(row[1], dict): row = fieldset_class(row[0], **row[1]) else: row = fieldset_class("{0}_{1}".format(base_name, index), fields=row) *************** *** 64,70 **** iterable of strings. """ for element in elements: ! if isinstance(element, collections.Iterable) and not isinstance(element, six.string_types): for sub_element in flatten(element): yield sub_element else: --- 63,69 ---- iterable of strings. """ for element in elements: ! if isinstance(element, Iterable) and not isinstance(element, str): for sub_element in flatten(element): yield sub_element else: *************** *** 73,79 **** flatten_to_tuple = lambda x: tuple(flatten(x)) - @python_2_unicode_compatible class Fieldset(CSSClassMixin): FIELDSET_CSS_CLASS = 'formFieldset' css_classes = None --- 72,77 ---- *************** *** 85,94 **** self.legend = kwargs.pop("legend", None) # Check for duplicate names. names = [str(thing) for thing in self.base_fields] ! duplicates = [x for x, y in collections.Counter(names).items() if y > 1] if duplicates: raise AttributeError('Name Conflict in fieldset `{0}`. The name(s) `{1}` appear multiple times.'.format(self.name, duplicates)) ! for key, value in six.iteritems(kwargs): setattr(self, key, value) def __iter__(self): --- 83,92 ---- self.legend = kwargs.pop("legend", None) # Check for duplicate names. names = [str(thing) for thing in self.base_fields] ! duplicates = [x for x, y in Counter(names).items() if y > 1] if duplicates: raise AttributeError('Name Conflict in fieldset `{0}`. The name(s) `{1}` appear multiple times.'.format(self.name, duplicates)) ! for key, value in iter(kwargs.items()): setattr(self, key, value) def __iter__(self): *************** *** 115,123 **** self.form = form self.name = name self.fieldset = fieldset ! self.rows = collections.OrderedDict() for row in fieldset: ! self.rows[six.text_type(row)] = row def __getitem__(self, key): """ --- 113,121 ---- self.form = form self.name = name self.fieldset = fieldset ! self.rows = OrderedDict() for row in fieldset: ! self.rows[str(row)] = row def __getitem__(self, key): """ *************** *** 129,135 **** if isinstance(key, int) and not key in self.rows: return self[list(self.rows.keys())[key]] value = self.rows[key] ! if isinstance(value, six.string_types): return self.form[value] else: return type(self)(self.form, value, key) --- 127,133 ---- if isinstance(key, int) and not key in self.rows: return self[list(self.rows.keys())[key]] value = self.rows[key] ! if isinstance(value, str): return self.form[value] else: return type(self)(self.form, value, key) *************** *** 248,254 **** return super(BetterModelFormMetaclass, cls).__new__(cls, name, bases, attrs) ! class BetterModelForm(six.with_metaclass(BetterModelFormMetaclass, FieldsetMixin, LabelSuffixMixin, CSSClassMixin, forms.ModelForm)): pass --- 246,252 ---- return super(BetterModelFormMetaclass, cls).__new__(cls, name, bases, attrs) ! class BetterModelForm(FieldsetMixin, LabelSuffixMixin, CSSClassMixin, forms.ModelForm, metaclass=BetterModelFormMetaclass): pass *************** *** 262,268 **** return super(BetterFormMetaClass, cls).__new__(cls, name, bases, attrs) ! class BetterForm(six.with_metaclass(BetterFormMetaClass, FieldsetMixin, LabelSuffixMixin, CSSClassMixin, forms.forms.BaseForm)): """ A 'Better' base Form class. """ --- 260,266 ---- return super(BetterFormMetaClass, cls).__new__(cls, name, bases, attrs) ! class BetterForm(FieldsetMixin, LabelSuffixMixin, CSSClassMixin, forms.forms.BaseForm, metaclass=BetterFormMetaClass): """ A 'Better' base Form class. """ diff -rc '-ICopyright (c)' '-I#Copyright ' -I#copyright '-I\$Header:' '-I\$Id:' '-I\$Revision:' '-I\$Date:' '-I\$HeadURL:' -I#history -xEntries -x.svn '-x*.pdf' '-x*.pyc' -x__pycache__ -x.git -x.hg django-betterforms-1.2/betterforms/__init__.py rl-django-betterforms-2.0.0/betterforms/__init__.py *** django-betterforms-1.2/betterforms/__init__.py 2018-07-03 16:24:41.000000000 +0100 --- rl-django-betterforms-2.0.0/betterforms/__init__.py 2020-07-21 12:07:00.000000000 +0100 *************** *** 1 **** ! __version__ = __import__('pkg_resources').get_distribution('django-betterforms').version --- 1 ---- ! __version__ = __import__('pkg_resources').get_distribution('rl-django-betterforms').version diff -rc '-ICopyright (c)' '-I#Copyright ' -I#copyright '-I\$Header:' '-I\$Id:' '-I\$Revision:' '-I\$Date:' '-I\$HeadURL:' -I#history -xEntries -x.svn '-x*.pdf' '-x*.pyc' -x__pycache__ -x.git -x.hg django-betterforms-1.2/betterforms/multiform.py rl-django-betterforms-2.0.0/betterforms/multiform.py *** django-betterforms-1.2/betterforms/multiform.py 2018-07-03 16:24:41.000000000 +0100 --- rl-django-betterforms-2.0.0/betterforms/multiform.py 2020-07-21 10:32:04.000000000 +0100 *************** *** 1,23 **** from itertools import chain from operator import add ! try: ! from collections import OrderedDict ! except ImportError: # Python 2.6, Django < 1.7 ! from django.utils.datastructures import SortedDict as OrderedDict # NOQA ! ! try: ! from django.forms.utils import ErrorDict, ErrorList ! except ImportError: # Django < 1.7 ! from django.forms.util import ErrorDict, ErrorList # NOQA from django.core.exceptions import ValidationError, NON_FIELD_ERRORS ! from django.utils.encoding import python_2_unicode_compatible from django.utils.safestring import mark_safe ! from django.utils.six.moves import reduce - @python_2_unicode_compatible class MultiForm(object): """ A container that allows you to treat multiple forms as one form. This is --- 1,14 ---- from itertools import chain from operator import add ! from collections import OrderedDict from django.core.exceptions import ValidationError, NON_FIELD_ERRORS ! from django.forms.utils import ErrorDict, ErrorList from django.utils.safestring import mark_safe ! from six.moves import reduce class MultiForm(object): """ A container that allows you to treat multiple forms as one form. This is diff -rc '-ICopyright (c)' '-I#Copyright ' -I#copyright '-I\$Header:' '-I\$Id:' '-I\$Revision:' '-I\$Date:' '-I\$HeadURL:' -I#history -xEntries -x.svn '-x*.pdf' '-x*.pyc' -x__pycache__ -x.git -x.hg django-betterforms-1.2/betterforms/tests.py rl-django-betterforms-2.0.0/betterforms/tests.py *** django-betterforms-1.2/betterforms/tests.py 2018-07-03 16:24:41.000000000 +0100 --- rl-django-betterforms-2.0.0/betterforms/tests.py 2020-07-21 12:06:22.000000000 +0100 *************** *** 1,10 **** import sys ! if sys.version_info < (2, 7): ! # In python < 2.7 unittest doesn't have expectedFailure ! from django.utils import unittest ! else: ! # django.utils.unittest became deprecated in Django 1.7 ! import unittest # NOQA import mock --- 1,5 ---- import sys ! import unittest # NOQA import mock Only in django-betterforms-1.2: django_betterforms.egg-info diff -rc '-ICopyright (c)' '-I#Copyright ' -I#copyright '-I\$Header:' '-I\$Id:' '-I\$Revision:' '-I\$Date:' '-I\$HeadURL:' -I#history -xEntries -x.svn '-x*.pdf' '-x*.pyc' -x__pycache__ -x.git -x.hg django-betterforms-1.2/PKG-INFO rl-django-betterforms-2.0.0/PKG-INFO *** django-betterforms-1.2/PKG-INFO 2018-07-03 16:24:41.000000000 +0100 --- rl-django-betterforms-2.0.0/PKG-INFO 2020-07-21 12:18:39.000000000 +0100 *************** *** 1,6 **** Metadata-Version: 1.1 ! Name: django-betterforms ! Version: 1.2 Summary: App for Django featuring improved form base classes. --- 1,6 ---- Metadata-Version: 1.1 ! Name: rl-django-betterforms ! Version: 2.0.0 Summary: App for Django featuring improved form base classes. *************** *** 34,51 **** Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Django ! Classifier: Framework :: Django :: 1.8 ! Classifier: Framework :: Django :: 1.9 ! Classifier: Framework :: Django :: 1.10 ! Classifier: Framework :: Django :: 1.11 ! Classifier: Framework :: Django :: 2.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Programming Language :: Python - Classifier: Programming Language :: Python :: 2 - Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 - Classifier: Programming Language :: Python :: 3.4 - Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Topic :: Internet :: WWW/HTTP --- 34,45 ---- Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Django ! Classifier: Framework :: Django :: 3.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.6 + Classifier: Programming Language :: Python :: 3.7 + Classifier: Programming Language :: Python :: 3.8 Classifier: Topic :: Internet :: WWW/HTTP Only in rl-django-betterforms-2.0.0: rl_django_betterforms.egg-info diff -rc '-ICopyright (c)' '-I#Copyright ' -I#copyright '-I\$Header:' '-I\$Id:' '-I\$Revision:' '-I\$Date:' '-I\$HeadURL:' -I#history -xEntries -x.svn '-x*.pdf' '-x*.pyc' -x__pycache__ -x.git -x.hg django-betterforms-1.2/setup.py rl-django-betterforms-2.0.0/setup.py *** django-betterforms-1.2/setup.py 2018-07-03 16:24:41.000000000 +0100 --- rl-django-betterforms-2.0.0/setup.py 2020-07-21 11:58:20.000000000 +0100 *************** *** 6,12 **** App for Django featuring improved form base classes. """ ! version = '1.2' def read(fname): --- 6,12 ---- App for Django featuring improved form base classes. """ ! version = '2.0.0' def read(fname): *************** *** 14,20 **** setup( ! name='django-betterforms', version=version, description=__doc__, long_description=read('README.rst'), --- 14,20 ---- setup( ! name='rl-django-betterforms', version=version, description=__doc__, long_description=read('README.rst'), *************** *** 23,48 **** author_email='programmers@fusionbox.com', packages=[package for package in find_packages() if package.startswith('betterforms')], ! install_requires=['Django>=1.8'], zip_safe=False, include_package_data=True, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Framework :: Django', ! 'Framework :: Django :: 1.8', ! 'Framework :: Django :: 1.9', ! 'Framework :: Django :: 1.10', ! 'Framework :: Django :: 1.11', ! 'Framework :: Django :: 2.0', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', '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', 'Topic :: Internet :: WWW/HTTP', ], ) --- 23,42 ---- author_email='programmers@fusionbox.com', packages=[package for package in find_packages() if package.startswith('betterforms')], ! install_requires=['Django>=3.0,<3.1'], zip_safe=False, include_package_data=True, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Framework :: Django', ! 'Framework :: Django :: 3.0', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Topic :: Internet :: WWW/HTTP', ], )