diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b81c05a..66f0eb4 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -23,3 +23,4 @@ jobs: - name: Run linting run: | ruff check . + ruff format --check diff --git a/docs/conf.py b/docs/conf.py index c669e80..892effe 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,38 +17,38 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.insert(0, os.path.abspath('..')) +sys.path.insert(0, os.path.abspath("..")) from wtforms_alchemy import __version__ # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.viewcode' + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.todo", + "sphinx.ext.viewcode", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'WTForms-Alchemy' -copyright = u'2012, Konsta Vesterinen' +project = "WTForms-Alchemy" +copyright = "2012, Konsta Vesterinen" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -61,156 +61,161 @@ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None +# language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build'] +exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = "default" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'WTForms-Alchemydoc' +htmlhelp_basename = "WTForms-Alchemydoc" # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). -#latex_paper_size = 'letter' +# latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). -#latex_font_size = '10pt' +# latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'WTForms-Alchemy.tex', u'WTForms-Alchemy Documentation', - u'Konsta Vesterinen', 'manual'), + ( + "index", + "WTForms-Alchemy.tex", + "WTForms-Alchemy Documentation", + "Konsta Vesterinen", + "manual", + ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Additional stuff for the LaTeX preamble. -#latex_preamble = '' +# latex_preamble = '' # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output -------------------------------------------- @@ -218,14 +223,20 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'wtforms-alchemy', u'WTForms-Alchemy Documentation', - [u'Konsta Vesterinen'], 1) + ( + "index", + "wtforms-alchemy", + "WTForms-Alchemy Documentation", + ["Konsta Vesterinen"], + 1, + ) ] # Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'http://docs.python.org/': None, - 'https://wtforms.readthedocs.io/en/latest/': None, - 'https://sqlalchemy-utils.readthedocs.io/en/latest/': None, - 'https://wtforms-components.readthedocs.io/en/latest/': None, - } +intersphinx_mapping = { + "http://docs.python.org/": None, + "https://wtforms.readthedocs.io/en/latest/": None, + "https://sqlalchemy-utils.readthedocs.io/en/latest/": None, + "https://wtforms-components.readthedocs.io/en/latest/": None, +} diff --git a/setup.py b/setup.py index ea285af..1e8a671 100644 --- a/setup.py +++ b/setup.py @@ -16,75 +16,75 @@ def get_version(): - filename = os.path.join(HERE, 'wtforms_alchemy', '__init__.py') + filename = os.path.join(HERE, "wtforms_alchemy", "__init__.py") with open(filename) as f: contents = f.read() - pattern = r"^__version__ = '(.*?)'$" + pattern = r'^__version__ = "(.*?)"$' return re.search(pattern, contents, re.MULTILINE).group(1) extras_require = { - 'test': [ - 'enum34', - 'pytest>=2.3', - 'Pygments>=1.2', - 'Jinja2>=2.3', - 'docutils>=0.10', - 'flexmock>=0.9.7', - 'ruff==0.7.4', - 'WTForms-Test>=0.1.1' + "test": [ + "enum34", + "pytest>=2.3", + "Pygments>=1.2", + "Jinja2>=2.3", + "docutils>=0.10", + "flexmock>=0.9.7", + "ruff==0.7.4", + "WTForms-Test>=0.1.1", ], - 'babel': ['Babel>=1.3'], - 'arrow': ['arrow>=0.3.4'], - 'phone': ['phonenumbers>=5.9.2'], - 'intervals': ['intervals>=0.2.0'], - 'password': ['passlib >= 1.6, < 2.0'], - 'color': ['colour>=0.0.4'], - 'i18n': ['SQLAlchemy-i18n >= 0.8.2'], - 'ipaddress': ['ipaddr'] if not PY3 else [], - 'timezone': ['python-dateutil'] + "babel": ["Babel>=1.3"], + "arrow": ["arrow>=0.3.4"], + "phone": ["phonenumbers>=5.9.2"], + "intervals": ["intervals>=0.2.0"], + "password": ["passlib >= 1.6, < 2.0"], + "color": ["colour>=0.0.4"], + "i18n": ["SQLAlchemy-i18n >= 0.8.2"], + "ipaddress": ["ipaddr"] if not PY3 else [], + "timezone": ["python-dateutil"], } # Add all optional dependencies to testing requirements. for name, requirements in extras_require.items(): - if name != 'test': - extras_require['test'] += requirements + if name != "test": + extras_require["test"] += requirements setup( - name='WTForms-Alchemy', + name="WTForms-Alchemy", version=get_version(), - url='https://github.com/kvesteri/wtforms-alchemy', - license='BSD', - author='Konsta Vesterinen', - author_email='konsta@fastmonkeys.com', - description='Generates WTForms forms from SQLAlchemy models.', + url="https://github.com/kvesteri/wtforms-alchemy", + license="BSD", + author="Konsta Vesterinen", + author_email="konsta@fastmonkeys.com", + description="Generates WTForms forms from SQLAlchemy models.", long_description=__doc__, - packages=['wtforms_alchemy'], + packages=["wtforms_alchemy"], zip_safe=False, include_package_data=True, - platforms='any', + platforms="any", install_requires=[ - 'SQLAlchemy>=1.4', - 'WTForms>=3.1.0', - 'WTForms-Components>=0.11.0', - 'SQLAlchemy-Utils>=0.40.0' + "SQLAlchemy>=1.4", + "WTForms>=3.1.0", + "WTForms-Components>=0.11.0", + "SQLAlchemy-Utils>=0.40.0", ], extras_require=extras_require, classifiers=[ - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: 3.12', - 'Programming Language :: Python :: 3.13', - 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', - 'Topic :: Software Development :: Libraries :: Python Modules' - ] + "Environment :: Web Environment", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Internet :: WWW/HTTP :: Dynamic Content", + "Topic :: Software Development :: Libraries :: Python Modules", + ], ) diff --git a/tests/__init__.py b/tests/__init__.py index 325ebe0..71bbd07 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -16,7 +16,7 @@ def getlist(self, key): class ModelFormTestCase(FormTestCase): - dns = 'sqlite:///:memory:' + dns = "sqlite:///:memory:" def setup_method(self, method): self.engine = create_engine(self.dns) @@ -28,14 +28,14 @@ def teardown_method(self, method): self.form_class = None def init_model(self, type_=sa.Unicode(255), **kwargs): - kwargs.setdefault('nullable', False) + kwargs.setdefault("nullable", False) class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" query = None id = sa.Column(sa.Integer, primary_key=True) test_column = sa.Column(type_, **kwargs) - some_property = 'something' + some_property = "something" self.ModelTest = ModelTest @@ -52,7 +52,7 @@ class Meta: class FormRelationsTestCase(object): - dns = 'sqlite:///:memory:' + dns = "sqlite:///:memory:" def setup_method(self, method): self.engine = create_engine(self.dns) diff --git a/tests/conftest.py b/tests/conftest.py index 4df9d8f..101f0e5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,7 +10,7 @@ class _MetaWithInit(FormMeta): def __init__(cls, *args, **kwargs): - cls.test_attr = 'SomeVal' + cls.test_attr = "SomeVal" FormMeta.__init__(cls, *args, **kwargs) @@ -18,7 +18,7 @@ def __init__(cls, *args, **kwargs): class _MetaWithoutInit(FormMeta): - test_attr = 'SomeVal' + test_attr = "SomeVal" MetaWithoutInit = model_form_meta_factory(_MetaWithoutInit) diff --git a/tests/test_class_map.py b/tests/test_class_map.py index bf7461c..b7f240c 100644 --- a/tests/test_class_map.py +++ b/tests/test_class_map.py @@ -35,47 +35,25 @@ class C(object): pass -@mark.parametrize( - 'key', - [B2, B, A, A2] -) +@mark.parametrize("key", [B2, B, A, A2]) def test_contains_with_subclass_check(key): class_map = ClassMap({A: 3, B: 6}) assert key in class_map -@mark.parametrize( - 'key', - [B2(), B(), A(), A2()] -) +@mark.parametrize("key", [B2(), B(), A(), A2()]) def test_contains_with_isinstance_check(key): class_map = ClassMap({A: 3, B: 6}) assert key in class_map -@mark.parametrize( - ('key', 'value'), - [ - (B2, 6), - (B, 6), - (A, 3), - (A2, 3) - ] -) +@mark.parametrize(("key", "value"), [(B2, 6), (B, 6), (A, 3), (A2, 3)]) def test_getitem_with_classes(key, value): class_map = ClassMap({A: 3, B: 6}) assert class_map[key] == value -@mark.parametrize( - ('key', 'value'), - [ - (B2(), 6), - (B(), 6), - (A(), 3), - (A2(), 3) - ] -) +@mark.parametrize(("key", "value"), [(B2(), 6), (B(), 6), (A(), 3), (A2(), 3)]) def test_getitem_with_objects(key, value): class_map = ClassMap({A: 3, B: 6}) assert class_map[key] == value @@ -84,4 +62,4 @@ def test_getitem_with_objects(key, value): def test_getitem_throws_keyerror_for_unknown_key(): class_map = ClassMap({A: 3, B: 6}) with raises(KeyError): - class_map['unknown'] + class_map["unknown"] diff --git a/tests/test_column_aliases.py b/tests/test_column_aliases.py index cdded6b..d24641c 100644 --- a/tests/test_column_aliases.py +++ b/tests/test_column_aliases.py @@ -8,24 +8,24 @@ class TestColumnAliases(ModelFormTestCase): def test_supports_column_aliases(self): class TestModel(self.base): - __tablename__ = 'TestTable' + __tablename__ = "TestTable" id = sa.Column(sa.Integer, primary_key=True) - some_alias = sa.Column('some_name', sa.Integer) + some_alias = sa.Column("some_name", sa.Integer) class TestForm(ModelForm): class Meta: model = TestModel form = TestForm() - assert hasattr(form, 'some_alias') - assert not hasattr(form, 'some_name') + assert hasattr(form, "some_alias") + assert not hasattr(form, "some_name") def test_labels(self): class TestModel(self.base): - __tablename__ = 'TestTable' + __tablename__ = "TestTable" id = sa.Column(sa.Integer, primary_key=True) some_alias = sa.Column( - 'some_name', + "some_name", sa.Integer, ) @@ -34,13 +34,13 @@ class Meta: model = TestModel form = TestForm() - assert form.some_alias.label.text == 'some_alias' + assert form.some_alias.label.text == "some_alias" def test_unique_indexes(self): class TestModel(self.base): - __tablename__ = 'TestTable' + __tablename__ = "TestTable" id = sa.Column(sa.Integer, primary_key=True) - some_alias = sa.Column('some_name', sa.Integer, unique=True) + some_alias = sa.Column("some_name", sa.Integer, unique=True) class TestForm(ModelForm): class Meta: @@ -51,32 +51,32 @@ def get_session(): return None form = TestForm() - assert hasattr(form, 'some_alias') - assert not hasattr(form, 'some_name') + assert hasattr(form, "some_alias") + assert not hasattr(form, "some_name") def test_meta_field_args(self): class TestModel(self.base): - __tablename__ = 'TestTable' + __tablename__ = "TestTable" id = sa.Column(sa.Integer, primary_key=True) - some_alias = sa.Column('some_name', sa.Integer) + some_alias = sa.Column("some_name", sa.Integer) validators = [NumberRange(max=4)] class TestForm(ModelForm): class Meta: model = TestModel - field_args = {'some_alias': {'validators': validators}} + field_args = {"some_alias": {"validators": validators}} form = TestForm() - assert hasattr(form, 'some_alias') - assert not hasattr(form, 'some_name') + assert hasattr(form, "some_alias") + assert not hasattr(form, "some_name") assert form.some_alias.validators == validators def test_additional_validators(self): class TestModel(self.base): - __tablename__ = 'TestTable' + __tablename__ = "TestTable" id = sa.Column(sa.Integer, primary_key=True) - some_alias = sa.Column('some_name', sa.Integer) + some_alias = sa.Column("some_name", sa.Integer) number_range = NumberRange(max=4) validator_list = [number_range] @@ -84,7 +84,7 @@ class TestModel(self.base): class TestForm(ModelForm): class Meta: model = TestModel - validators = {'some_alias': validator_list} + validators = {"some_alias": validator_list} form = TestForm() assert number_range in form.some_alias.validators diff --git a/tests/test_configuration.py b/tests/test_configuration.py index 59b2503..653f278 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -19,11 +19,11 @@ def get_col_spec(self): class TestModelFormConfiguration(ModelFormTestCase): def test_skip_unknown_types(self): class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" query = None id = sa.Column(sa.Integer, primary_key=True) test_column = sa.Column(UnknownType) - some_property = 'something' + some_property = "something" self.ModelTest = ModelTest @@ -33,7 +33,7 @@ class Meta: skip_unknown_types = True self.form_class = ModelTestForm - assert not self.has_field('test_column') + assert not self.has_field("test_column") def test_supports_field_exclusion(self): self.init_model() @@ -41,19 +41,20 @@ def test_supports_field_exclusion(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - exclude = ['test_column'] + exclude = ["test_column"] self.form_class = ModelTestForm - assert not self.has_field('test_column') + assert not self.has_field("test_column") def test_throws_exception_for_unknown_excluded_column(self): self.init_model() with raises(InvalidAttributeException): + class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - exclude = ['some_unknown_column'] + exclude = ["some_unknown_column"] def test_invalid_exclude_with_attr_errors_as_false(self): self.init_model() @@ -62,16 +63,17 @@ class ModelTestForm(ModelForm): class Meta: model = self.ModelTest attr_errors = False - exclude = ['some_unknown_column'] + exclude = ["some_unknown_column"] def test_throws_exception_for_unknown_included_column(self): self.init_model() with raises(InvalidAttributeException): + class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - include = ['some_unknown_column'] + include = ["some_unknown_column"] def test_invalid_include_with_attr_errors_as_false(self): self.init_model() @@ -80,16 +82,17 @@ class ModelTestForm(ModelForm): class Meta: model = self.ModelTest attr_errors = False - include = ['some_unknown_column'] + include = ["some_unknown_column"] def test_throws_exception_for_non_column_fields(self): self.init_model() with raises(AttributeTypeException): + class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - include = ['some_property'] + include = ["some_property"] def test_supports_field_inclusion(self): self.init() @@ -97,14 +100,14 @@ def test_supports_field_inclusion(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - include = ['id'] + include = ["id"] self.form_class = ModelTestForm - assert self.has_field('id') + assert self.has_field("id") def test_supports_only_attribute(self): class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" query = None id = sa.Column(sa.Integer, primary_key=True) test_column = sa.Column(sa.UnicodeText) @@ -113,7 +116,7 @@ class ModelTest(self.base): class ModelTestForm(ModelForm): class Meta: model = ModelTest - only = ['test_column'] + only = ["test_column"] form = ModelTestForm() assert len(form._fields) == 1 @@ -128,7 +131,7 @@ class Meta: test_column = IntegerField() self.form_class = ModelTestForm - self.assert_type('test_column', IntegerField) + self.assert_type("test_column", IntegerField) def test_supports_assigning_all_fields_as_optional(self): self.init(nullable=False) @@ -139,8 +142,8 @@ class Meta: all_fields_optional = True self.form_class = ModelTestForm - self.assert_not_required('test_column') - self.assert_optional('test_column') + self.assert_not_required("test_column") + self.assert_optional("test_column") def test_supports_custom_datetime_format(self): self.init(sa.DateTime, nullable=False) @@ -148,10 +151,10 @@ def test_supports_custom_datetime_format(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - datetime_format = '%Y-%m-%dT%H:%M:%S' + datetime_format = "%Y-%m-%dT%H:%M:%S" form = ModelTestForm() - assert form.test_column.format == ['%Y-%m-%dT%H:%M:%S'] + assert form.test_column.format == ["%Y-%m-%dT%H:%M:%S"] def test_supports_additional_validators(self): self.init() @@ -159,10 +162,10 @@ def test_supports_additional_validators(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - validators = {'test_column': Email()} + validators = {"test_column": Email()} self.form_class = ModelTestForm - self.assert_has_validator('test_column', Email) + self.assert_has_validator("test_column", Email) def test_inherits_config_params_from_parent_meta(self): self.init() @@ -170,13 +173,13 @@ def test_inherits_config_params_from_parent_meta(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - only = ['test_column'] + only = ["test_column"] class AnotherModelTestForm(ModelTestForm): class Meta: pass - assert AnotherModelTestForm.Meta.only == ['test_column'] + assert AnotherModelTestForm.Meta.only == ["test_column"] def test_child_classes_override_parents_config_params(self): self.init() @@ -184,7 +187,7 @@ def test_child_classes_override_parents_config_params(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - only = ['test_column'] + only = ["test_column"] class AnotherModelTestForm(ModelTestForm): class Meta: @@ -198,11 +201,11 @@ def test_strip_strings_fields(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - only = ['test_column'] + only = ["test_column"] strip_string_fields = True - form = ModelTestForm(MultiDict(test_column=u' something ')) - assert form.test_column.data == u'something' + form = ModelTestForm(MultiDict(test_column=" something ")) + assert form.test_column.data == "something" def test_strip_strings_fields_with_empty_values(self): self.init() @@ -210,7 +213,7 @@ def test_strip_strings_fields_with_empty_values(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - only = ['test_column'] + only = ["test_column"] strip_string_fields = True ModelTestForm() diff --git a/tests/test_country_field.py b/tests/test_country_field.py index 7bdb4a0..215ba50 100644 --- a/tests/test_country_field.py +++ b/tests/test_country_field.py @@ -5,7 +5,7 @@ from tests import MultiDict from wtforms_alchemy import CountryField -sqlalchemy_utils.i18n.get_locale = lambda: Locale('en') +sqlalchemy_utils.i18n.get_locale = lambda: Locale("en") class TestCountryField(object): @@ -19,13 +19,9 @@ class TestForm(Form): return self.form_class def setup_method(self, method): - self.valid_countries = [ - 'US', - 'SA', - 'FI' - ] + self.valid_countries = ["US", "SA", "FI"] self.invalid_countries = [ - 'unknown', + "unknown", ] def test_valid_countries(self): @@ -40,4 +36,4 @@ def test_invalid_countries(self): for country in self.invalid_countries: form = form_class(MultiDict(test_field=country)) form.validate() - assert len(form.errors['test_field']) == 2 + assert len(form.errors["test_field"]) == 2 diff --git a/tests/test_custom_fields.py b/tests/test_custom_fields.py index 368dd20..18fb4f9 100644 --- a/tests/test_custom_fields.py +++ b/tests/test_custom_fields.py @@ -9,10 +9,10 @@ class TestSelectField(object): def test_understands_none_values(self): class MyForm(Form): choice_field = SelectField( - choices=[('', '-- Choose --'), ('choice 1', 'Something')], - coerce=null_or_unicode + choices=[("", "-- Choose --"), ("choice 1", "Something")], + coerce=null_or_unicode, ) - form = MyForm(MultiDict({'choice_field': u''})) + form = MyForm(MultiDict({"choice_field": ""})) form.validate() assert form.errors == {} diff --git a/tests/test_deep_form_relations.py b/tests/test_deep_form_relations.py index f3f1aff..2440d75 100644 --- a/tests/test_deep_form_relations.py +++ b/tests/test_deep_form_relations.py @@ -8,17 +8,17 @@ class TestDeepFormRelationsOneToManyToOne(FormRelationsTestCase): def create_models(self): class Event(self.base): - __tablename__ = 'event' + __tablename__ = "event" id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=False) class Address(self.base): - __tablename__ = 'address' + __tablename__ = "address" id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) street = sa.Column(sa.Unicode(255), nullable=True) class Location(self.base): - __tablename__ = 'location' + __tablename__ = "location" id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=True) @@ -26,7 +26,7 @@ class Location(self.base): address = sa.orm.relationship(Address) event_id = sa.Column(sa.Integer, sa.ForeignKey(Event.id)) - event = sa.orm.relationship(Event, backref='locations') + event = sa.orm.relationship(Event, backref="locations") self.Event = Event self.Location = Location @@ -55,9 +55,9 @@ class Meta: def save(self): data = { - 'name': u'Some event', - 'locations-0-name': u'Some location', - 'locations-0-address-street': u'Some address' + "name": "Some event", + "locations-0-name": "Some location", + "locations-0-address-street": "Some address", } event = self.Event() self.session.add(event) @@ -69,11 +69,9 @@ def save(self): def test_assigment_and_deletion(self): self.save() event = self.session.query(self.Event).first() - assert event.locations[0].name == u'Some location' - assert event.locations[0].address.street == u'Some address' - data = { - 'name': u'Some event' - } + assert event.locations[0].name == "Some location" + assert event.locations[0].address.street == "Some address" + data = {"name": "Some event"} form = self.EventForm(MultiDict(data)) form.validate() form.populate_obj(event) @@ -85,20 +83,20 @@ def test_assigment_and_deletion(self): class TestDeepFormRelationsOneToOneToMany(FormRelationsTestCase): def create_models(self): class Location(self.base): - __tablename__ = 'location' + __tablename__ = "location" id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=True) class Address(self.base): - __tablename__ = 'address' + __tablename__ = "address" id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) street = sa.Column(sa.Unicode(255), nullable=True) location_id = sa.Column(sa.Integer, sa.ForeignKey(Location.id)) - location = sa.orm.relationship(Location, backref='addresses') + location = sa.orm.relationship(Location, backref="addresses") class Event(self.base): - __tablename__ = 'event' + __tablename__ = "event" id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=False) location_id = sa.Column(sa.Integer, sa.ForeignKey(Location.id)) @@ -131,9 +129,9 @@ class Meta: def save(self): data = { - 'name': u'Some event', - 'location-name': u'Some location', - 'location-addresses-0-street': u'Some address' + "name": "Some event", + "location-name": "Some location", + "location-addresses-0-street": "Some address", } event = self.Event() self.session.add(event) @@ -145,11 +143,9 @@ def save(self): def test_assigment_and_deletion(self): self.save() event = self.session.query(self.Event).first() - assert event.location.name == u'Some location' - assert event.location.addresses[0].street == u'Some address' - data = { - 'name': u'Some event' - } + assert event.location.name == "Some location" + assert event.location.addresses[0].street == "Some address" + data = {"name": "Some event"} form = self.EventForm(MultiDict(data)) form.validate() form.populate_obj(event) diff --git a/tests/test_descriptions.py b/tests/test_descriptions.py index 813d9d4..f902ba9 100644 --- a/tests/test_descriptions.py +++ b/tests/test_descriptions.py @@ -4,8 +4,8 @@ class TestFieldParameters(ModelFormTestCase): def test_assigns_description_from_column_info(self): - self.init(info={'description': 'Description'}) - self.assert_description('test_column', 'Description') + self.init(info={"description": "Description"}) + self.assert_description("test_column", "Description") def test_assigns_descriptions_from_form_configuration(self): self.init() @@ -14,9 +14,7 @@ class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - field_args = { - 'test_column': {'description': 'TESTING'} - } + field_args = {"test_column": {"description": "TESTING"}} self.form_class = ModelTestForm - self.assert_description('test_column', 'TESTING') + self.assert_description("test_column", "TESTING") diff --git a/tests/test_field_exclusion.py b/tests/test_field_exclusion.py index ccc4e38..f0e96bb 100644 --- a/tests/test_field_exclusion.py +++ b/tests/test_field_exclusion.py @@ -9,11 +9,11 @@ class TestFieldExclusion(ModelFormTestCase): def test_does_not_include_datetime_columns_with_default(self): self.init(sa.DateTime, default=datetime.now()) - assert not self.has_field('test_column') + assert not self.has_field("test_column") def test_excludes_surrogate_primary_keys_by_default(self): self.init() - assert not self.has_field('id') + assert not self.has_field("id") def test_excludes_column_properties(self): self.init() @@ -25,7 +25,6 @@ def test_excludes_column_properties(self): class TestTSVectorType(ModelFormTestCase): - def test_does_not_include_tsvector_typed_columns_with_default(self): self.init(TSVectorType) - assert not self.has_field('test_column') + assert not self.has_field("test_column") diff --git a/tests/test_field_order.py b/tests/test_field_order.py index 9e84de7..5106afc 100644 --- a/tests/test_field_order.py +++ b/tests/test_field_order.py @@ -8,7 +8,7 @@ def setup_method(self, method): ModelFormTestCase.setup_method(self, method) class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=True) full_description = sa.Column(sa.UnicodeText) diff --git a/tests/test_field_parameters.py b/tests/test_field_parameters.py index 135e97f..640391b 100644 --- a/tests/test_field_parameters.py +++ b/tests/test_field_parameters.py @@ -13,86 +13,82 @@ class TestFieldParameters(ModelFormTestCase): def test_accepts_custom_widgets(self): - self.init(info={'widget': widgets.HiddenInput()}) + self.init(info={"widget": widgets.HiddenInput()}) form = self.form_class() assert isinstance(form.test_column.widget, widgets.HiddenInput) def test_accepts_custom_filters(self): def test_filter(a): return a - self.init(info={'filters': [test_filter]}) + + self.init(info={"filters": [test_filter]}) form = self.form_class() assert test_filter in form.test_column.filters def test_assigns_description_from_column_info(self): - self.init(info={'description': 'Description'}) - self.assert_description('test_column', 'Description') + self.init(info={"description": "Description"}) + self.assert_description("test_column", "Description") def test_does_not_add_default_value_if_default_is_callable(self): self.init(default=lambda: "test") - self.assert_default('test_column', None) + self.assert_default("test_column", None) def test_assigns_scalar_defaults(self): - self.init(default=u"test") - self.assert_default('test_column', "test") + self.init(default="test") + self.assert_default("test_column", "test") def test_min_and_max_info_attributes_with_integer_field(self): - self.init(type_=sa.Integer, info={'min': 1, 'max': 100}) - validator = self.get_validator('test_column', NumberRange) + self.init(type_=sa.Integer, info={"min": 1, "max": 100}) + validator = self.get_validator("test_column", NumberRange) assert validator.min == 1 assert validator.max == 100 def test_min_and_max_info_attributes_with_numeric_field(self): - self.init(type_=sa.Numeric, info={'min': 1, 'max': 100}) - validator = self.get_validator('test_column', NumberRange) + self.init(type_=sa.Numeric, info={"min": 1, "max": 100}) + validator = self.get_validator("test_column", NumberRange) assert validator.min == 1 assert validator.max == 100 def test_min_and_max_info_attributes_with_float_field(self): - self.init(type_=sa.Float, info={'min': 1, 'max': 100}) - validator = self.get_validator('test_column', NumberRange) + self.init(type_=sa.Float, info={"min": 1, "max": 100}) + validator = self.get_validator("test_column", NumberRange) assert validator.min == 1 assert validator.max == 100 def test_min_and_max_info_attributes_with_int_range_field(self): - self.init(type_=IntRangeType, info={'min': 1, 'max': 100}) - validator = self.get_validator('test_column', NumberRange) + self.init(type_=IntRangeType, info={"min": 1, "max": 100}) + validator = self.get_validator("test_column", NumberRange) assert validator.min == 1 assert validator.max == 100 def test_min_and_max_info_attributes_generate_time_range_validator(self): - self.init( - type_=sa.types.Time, - info={'min': time(12, 30), 'max': time(14, 30)} - ) - validator = self.get_validator('test_column', TimeRange) + self.init(type_=sa.types.Time, info={"min": time(12, 30), "max": time(14, 30)}) + validator = self.get_validator("test_column", TimeRange) assert validator.min == time(12, 30) assert validator.max == time(14, 30) def test_min_and_max_info_attributes_generate_date_range_validator(self): self.init( - type_=sa.Date, - info={'min': date(1990, 1, 1), 'max': date(2000, 1, 1)} + type_=sa.Date, info={"min": date(1990, 1, 1), "max": date(2000, 1, 1)} ) - validator = self.get_validator('test_column', DateRange) + validator = self.get_validator("test_column", DateRange) assert validator.min == date(1990, 1, 1) assert validator.max == date(2000, 1, 1) def test_uses_custom_field_class(self): class InputTest(widgets.Input): - input_type = 'color' + input_type = "color" validation_attrs = [] class FieldTest(StringField): widget = InputTest() class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" query = None id = sa.Column(sa.Integer, primary_key=True) test_column = sa.Column( - sa.UnicodeText, - info={'form_field_class': FieldTest} + sa.UnicodeText, info={"form_field_class": FieldTest} ) class ModelTestForm(ModelForm): @@ -104,13 +100,10 @@ class Meta: def test_accepts_none_as_custom_field_class(self): class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" query = None id = sa.Column(sa.Integer, primary_key=True) - test_column = sa.Column( - sa.UnicodeText, - info={'form_field_class': None} - ) + test_column = sa.Column(sa.UnicodeText, info={"form_field_class": None}) class ModelTestForm(ModelForm): class Meta: diff --git a/tests/test_field_trimming.py b/tests/test_field_trimming.py index b7cdbc2..39e7567 100644 --- a/tests/test_field_trimming.py +++ b/tests/test_field_trimming.py @@ -11,16 +11,16 @@ class Meta: model = self.ModelTest strip_string_fields = True - f = ModelTestForm(MultiDict([('test_column', 'strip this ')])) - assert f.test_column.data == 'strip this' + f = ModelTestForm(MultiDict([("test_column", "strip this ")])) + assert f.test_column.data == "strip this" def test_does_not_trim_fields_when_trim_param_is_false(self): - self.init(info={'trim': False}) + self.init(info={"trim": False}) class ModelTestForm(ModelForm): class Meta: model = self.ModelTest strip_string_fields = True - f = ModelTestForm(MultiDict([('test_column', 'strip this ')])) - assert f.test_column.data == 'strip this ' + f = ModelTestForm(MultiDict([("test_column", "strip this ")])) + assert f.test_column.data == "strip this " diff --git a/tests/test_form_meta.py b/tests/test_form_meta.py index f2f77b6..3c7d0ed 100644 --- a/tests/test_form_meta.py +++ b/tests/test_form_meta.py @@ -4,7 +4,6 @@ class TestModelFormMetaWithInheritance(ModelFormTestCase): - def test_skip_unknown_types(self, model_form_all): self.init(type_=sa.Integer) @@ -26,7 +25,7 @@ class ModelTestForm(model_form_custom): class Meta: model = self.ModelTest - assert ModelTestForm.test_attr == 'SomeVal' + assert ModelTestForm.test_attr == "SomeVal" class TestUnboundFieldsInitialization(ModelFormTestCase): diff --git a/tests/test_hybrid_properties.py b/tests/test_hybrid_properties.py index b7686b9..f68b5e8 100644 --- a/tests/test_hybrid_properties.py +++ b/tests/test_hybrid_properties.py @@ -10,9 +10,9 @@ class TestHybridProperties(ModelFormTestCase): def test_hybrid_property_returning_column_property(self): class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" id = sa.Column(sa.Integer, primary_key=True) - _test_column = sa.Column('test_column', sa.Boolean, nullable=False) + _test_column = sa.Column("test_column", sa.Boolean, nullable=False) @hybrid_property def test_column_hybrid(self): @@ -27,17 +27,17 @@ class Meta: model = ModelTest not_null_str_validator = None not_null_validator = None - include = ('test_column_hybrid', ) - exclude = ('_test_column', ) + include = ("test_column_hybrid",) + exclude = ("_test_column",) form = ModelTestForm() assert form.test_column_hybrid def test_hybrid_property_returning_expression(self): class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" id = sa.Column(sa.Integer, primary_key=True) - _test_column = sa.Column('test_column', sa.Boolean, nullable=False) + _test_column = sa.Column("test_column", sa.Boolean, nullable=False) @hybrid_property def test_column_hybrid(self): @@ -48,10 +48,11 @@ def test_column_hybrid(self, value): self._test_column = value with raises(AttributeTypeException): + class ModelTestForm(ModelForm): class Meta: model = ModelTest not_null_str_validator = None not_null_validator = None - include = ('test_column_hybrid', ) - exclude = ('_test_column', ) + include = ("test_column_hybrid",) + exclude = ("_test_column",) diff --git a/tests/test_i18n_extension.py b/tests/test_i18n_extension.py index 6e8aa98..5610ec4 100644 --- a/tests/test_i18n_extension.py +++ b/tests/test_i18n_extension.py @@ -16,18 +16,16 @@ class TestInternationalizationExtension(ModelFormTestCase): def init(self): class ModelTest(self.base, Translatable): - __tablename__ = 'model_test' - __translatable__ = { - 'locales': ['fi', 'en'] - } + __tablename__ = "model_test" + __translatable__ = {"locales": ["fi", "en"]} id = sa.Column(sa.Integer, primary_key=True) - some_property = 'something' + some_property = "something" - locale = 'en' + locale = "en" class ModelTranslation(translation_base(ModelTest)): - __tablename__ = 'model_translation' + __tablename__ = "model_translation" name = sa.Column(sa.Unicode(255)) content = sa.Column(sa.Unicode(255)) @@ -51,7 +49,7 @@ def test_supports_field_exclusion(self): class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - exclude = ['name'] + exclude = ["name"] with raises(AttributeError): ModelTestForm().name @@ -64,9 +62,9 @@ class Meta: model = self.ModelTest form = ModelTestForm( - MultiDict([('name', u'something'), ('content', u'something')]) + MultiDict([("name", "something"), ("content", "something")]) ) obj = self.ModelTest() form.populate_obj(obj) - assert obj.name == u'something' - assert obj.content == u'something' + assert obj.name == "something" + assert obj.content == "something" diff --git a/tests/test_inheritance.py b/tests/test_inheritance.py index 354b93f..4c94673 100644 --- a/tests/test_inheritance.py +++ b/tests/test_inheritance.py @@ -8,7 +8,7 @@ class TestInheritance(FormTestCase): class Base(Form): @classmethod def get_session(self): - return 'TestSession' + return "TestSession" def test_default_base(self): assert ModelForm.get_session is None @@ -19,7 +19,7 @@ def test_custom_base_without_session(self): def test_custom_base_with_session(self): cls = model_form_factory(self.Base) - assert cls.get_session() == 'TestSession' + assert cls.get_session() == "TestSession" def test_inherit_with_new_session(self): cls = model_form_factory(self.Base) @@ -27,12 +27,14 @@ def test_inherit_with_new_session(self): class Sub(cls): @classmethod def get_session(self): - return 'SubTestSession' - assert Sub.get_session() == 'SubTestSession' + return "SubTestSession" + + assert Sub.get_session() == "SubTestSession" def test_inherit_without_new_session(self): cls = model_form_factory(self.Base) class Sub(cls): pass - assert Sub.get_session() == 'TestSession' + + assert Sub.get_session() == "TestSession" diff --git a/tests/test_labels.py b/tests/test_labels.py index 561352a..92d640a 100644 --- a/tests/test_labels.py +++ b/tests/test_labels.py @@ -4,8 +4,8 @@ class TestFieldLabels(ModelFormTestCase): def test_assigns_labels_from_column_info(self): - self.init(info={'label': 'Test Column'}) - self.assert_label('test_column', 'Test Column') + self.init(info={"label": "Test Column"}) + self.assert_label("test_column", "Test Column") def test_assigns_labels_from_form_configuration(self): self.init() @@ -14,9 +14,7 @@ class ModelTestForm(ModelForm): class Meta: model = self.ModelTest - field_args = { - 'test_column': {'label': 'TESTING'} - } + field_args = {"test_column": {"label": "TESTING"}} self.form_class = ModelTestForm - self.assert_label('test_column', 'TESTING') + self.assert_label("test_column", "TESTING") diff --git a/tests/test_model_field_list.py b/tests/test_model_field_list.py index 0ae5018..bc390b3 100644 --- a/tests/test_model_field_list.py +++ b/tests/test_model_field_list.py @@ -9,17 +9,17 @@ class ModelFieldListTestCase(FormRelationsTestCase): def create_models(self): class Event(self.base): - __tablename__ = 'event' + __tablename__ = "event" id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=False) class Location(self.base): - __tablename__ = 'location' + __tablename__ = "location" id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=True) event_id = sa.Column(sa.Integer, sa.ForeignKey(Event.id)) - event = sa.orm.relationship(Event, backref='locations') + event = sa.orm.relationship(Event, backref="locations") self.Event = Event self.Location = Location @@ -27,9 +27,9 @@ class Location(self.base): def save(self, event=None, data=None): if data is None: data = { - 'name': u'Some event', - 'locations-0-name': u'Some location', - 'locations-0-description': u'Some description' + "name": "Some event", + "locations-0-name": "Some location", + "locations-0-description": "Some description", } if not event: event = self.Event() @@ -62,10 +62,8 @@ class Meta: def test_assigment_and_deletion(self): self.save() event = self.session.query(self.Event).first() - assert event.locations[0].name == u'Some location' - data = { - 'name': u'Some event' - } + assert event.locations[0].name == "Some location" + data = {"name": "Some event"} form = self.EventForm(MultiDict(data)) form.validate() form.populate_obj(event) @@ -77,28 +75,26 @@ def test_assigment_and_deletion(self): class TestUpdateStrategy(ModelFieldListTestCase): def create_models(self): class Event(self.base): - __tablename__ = 'event' + __tablename__ = "event" id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=False) class Location(self.base): - __tablename__ = 'location' - TYPES = (u'', u'football field', u'restaurant') + __tablename__ = "location" + TYPES = ("", "football field", "restaurant") id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=True) - description = sa.Column(sa.Unicode(255), default=u'') + description = sa.Column(sa.Unicode(255), default="") type = sa.Column( - sa.Unicode(255), - info={'choices': zip(TYPES, TYPES)}, - default=u'' + sa.Unicode(255), info={"choices": zip(TYPES, TYPES)}, default="" ) event_id = sa.Column(sa.Integer, sa.ForeignKey(Event.id)) - event = sa.orm.relationship(Event, backref='locations') + event = sa.orm.relationship(Event, backref="locations") def __repr__(self): - return 'Location(id=%r, name=%r)' % (self.id, self.name) + return "Location(id=%r, name=%r)" % (self.id, self.name) self.Event = Event self.Location = Location @@ -107,7 +103,7 @@ def create_forms(self): class LocationForm(ModelForm): class Meta: model = self.Location - only = ['name', 'description', 'type'] + only = ["name", "description", "type"] id = PassiveHiddenField() @@ -116,8 +112,7 @@ class Meta: model = self.Event locations = ModelFieldList( - FormField(LocationForm), - population_strategy='update' + FormField(LocationForm), population_strategy="update" ) self.LocationForm = LocationForm @@ -127,23 +122,23 @@ def test_single_entry_update(self): event = self.save() location_id = event.locations[0].id data = { - 'name': u'Some event', - 'locations-0-id': location_id, - 'locations-0-name': u'Some other location' + "name": "Some event", + "locations-0-id": location_id, + "locations-0-name": "Some other location", } self.save(event, data) assert len(event.locations) == 1 assert event.locations[0].id == location_id - assert event.locations[0].name == u'Some other location' + assert event.locations[0].name == "Some other location" def test_creates_new_objects_for_entries_with_unknown_identifiers(self): event = self.save() location_id = event.locations[0].id data = { - 'name': u'Some event', - 'locations-0-id': 12, - 'locations-0-name': u'Some other location' + "name": "Some event", + "locations-0-id": 12, + "locations-0-name": "Some other location", } self.save(event, data) assert event.locations @@ -151,99 +146,89 @@ def test_creates_new_objects_for_entries_with_unknown_identifiers(self): def test_replace_entry(self): data = { - 'name': u'Some event', - 'locations-0-name': u'Some location', - 'locations-0-description': u'Some description', - 'locations-0-type': u'restaurant' + "name": "Some event", + "locations-0-name": "Some location", + "locations-0-description": "Some description", + "locations-0-type": "restaurant", } event = self.save(data=data) location_id = event.locations[0].id self.session.commit() data = { - 'name': u'Some event', - 'locations-0-name': u'Some other location', + "name": "Some event", + "locations-0-name": "Some other location", } self.save(event, data) location = event.locations[0] assert location.id != location_id - assert location.name == u'Some other location' - assert location.description == u'' - assert location.type == u'' + assert location.name == "Some other location" + assert location.description == "" + assert location.type == "" assert len(event.locations) == 1 def test_replace_and_update(self): data = { - 'name': u'Some event', - 'locations-0-name': u'Location 1', - 'locations-0-description': u'Location 1 description', - 'locations-1-name': u'Location 2', - 'locations-1-description': u'Location 2 description', + "name": "Some event", + "locations-0-name": "Location 1", + "locations-0-description": "Location 1 description", + "locations-1-name": "Location 2", + "locations-1-description": "Location 2 description", } event = self.save(data=data) self.session.commit() data = { - 'name': u'Some event', - 'locations-0-id': event.locations[1].id, - 'locations-0-name': u'Location 2 updated', - 'locations-0-description': u'Location 2 description updated', - 'locations-1-name': u'Location 3', + "name": "Some event", + "locations-0-id": event.locations[1].id, + "locations-0-name": "Location 2 updated", + "locations-0-description": "Location 2 description updated", + "locations-1-name": "Location 3", } self.save(event, data) self.session.commit() location = event.locations[0] location2 = event.locations[1] - assert location.name == u'Location 2 updated' - assert location.description == u'Location 2 description updated' + assert location.name == "Location 2 updated" + assert location.description == "Location 2 description updated" assert len(event.locations) == 2 - assert location2.name == u'Location 3' - assert location2.description == u'' + assert location2.name == "Location 3" + assert location2.description == "" def test_multiple_entries(self): event = self.save() location_id = event.locations[0].id data = { - 'name': u'Some event', - 'locations-0-name': u'Some location', - 'locations-1-id': str(location_id), # test coercing works - 'locations-1-name': u'Some other location', - 'locations-2-name': u'Third location', - 'locations-3-id': 123, - 'locations-3-name': u'Fourth location' + "name": "Some event", + "locations-0-name": "Some location", + "locations-1-id": str(location_id), # test coercing works + "locations-1-name": "Some other location", + "locations-2-name": "Third location", + "locations-3-id": 123, + "locations-3-name": "Fourth location", } self.save(event, data) assert len(event.locations) == 4 assert event.locations[0].id == location_id - assert event.locations[0].name == u'Some other location' - assert event.locations[1].name == u'Some location' - assert event.locations[2].name == u'Third location' - assert event.locations[3].name == u'Fourth location' + assert event.locations[0].name == "Some other location" + assert event.locations[1].name == "Some location" + assert event.locations[2].name == "Third location" + assert event.locations[3].name == "Fourth location" def test_delete_all_field_list_entries(self): event = self.save() - data = { - 'name': u'Some event' - } + data = {"name": "Some event"} self.save(event, data) assert not event.locations def test_update_and_remove(self): - location = self.Location( - name=u'Location #2' - ) + location = self.Location(name="Location #2") event = self.Event( - name=u'Some event', - locations=[ - self.Location( - name=u'Location #1' - ), - location - ] + name="Some event", locations=[self.Location(name="Location #1"), location] ) self.session.add(event) self.session.commit() data = { - 'locations-0-id': location.id, - 'locations-0-name': u'Location', + "locations-0-id": location.id, + "locations-0-name": "Location", } self.save(event, data) self.session.refresh(event) diff --git a/tests/test_model_form_factory.py b/tests/test_model_form_factory.py index 59d8360..1d4e0ea 100644 --- a/tests/test_model_form_factory.py +++ b/tests/test_model_form_factory.py @@ -18,15 +18,15 @@ class MyFormGenerator(FormGenerator): pass defaults = { - 'all_fields_optional': True, - 'only_indexed_fields': True, - 'include_primary_keys': True, - 'include_foreign_keys': True, - 'strip_string_fields': True, - 'include_datetimes_with_default': True, - 'form_generator': True, - 'date_format': '%d-%m-%Y', - 'datetime_format': '%Y-%m-%dT%H:%M:%S', + "all_fields_optional": True, + "only_indexed_fields": True, + "include_primary_keys": True, + "include_foreign_keys": True, + "strip_string_fields": True, + "include_datetimes_with_default": True, + "form_generator": True, + "date_format": "%d-%m-%Y", + "datetime_format": "%Y-%m-%dT%H:%M:%S", } ModelForm = model_form_factory(Form, **defaults) for key, value in defaults.items(): @@ -38,9 +38,7 @@ def test_throws_exception_for_unknown_configuration_option(self): class SomeForm(Form): pass - defaults = { - 'unknown': 'something' - } + defaults = {"unknown": "something"} with raises(UnknownConfigurationOption): model_form_factory(SomeForm, **defaults) @@ -93,7 +91,7 @@ def test_class_meta_wtforms2(self): class SomeForm(Form): class Meta: - locales = ['fr'] + locales = ["fr"] foo = 9 class OtherForm(SomeForm): @@ -107,9 +105,9 @@ class Meta: form = TestCustomBase() other_form = OtherForm() assert isinstance(form.meta, wtforms.meta.DefaultMeta) - assert form.meta.locales == ['fr'] - assert hasattr(form.meta, 'model') - assert hasattr(form.meta, 'csrf') + assert form.meta.locales == ["fr"] + assert hasattr(form.meta, "model") + assert hasattr(form.meta, "csrf") assert form.meta.foo == 9 # Create a side effect on the base meta. diff --git a/tests/test_model_form_field.py b/tests/test_model_form_field.py index c58ddc9..d855291 100644 --- a/tests/test_model_form_field.py +++ b/tests/test_model_form_field.py @@ -8,12 +8,12 @@ class TestOneToOneModelFormRelations(FormRelationsTestCase): def create_models(self): class Location(self.base): - __tablename__ = 'location' + __tablename__ = "location" id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=True) class Event(self.base): - __tablename__ = 'event' + __tablename__ = "event" id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.Unicode(255), nullable=False) location_id = sa.Column(sa.Integer, sa.ForeignKey(Location.id)) @@ -39,8 +39,8 @@ class Meta: def save(self, event=None, data={}): if not data: data = { - 'name': u'Some event', - 'location-name': u'Some location', + "name": "Some event", + "location-name": "Some location", } if not event: event = self.Event() @@ -54,10 +54,8 @@ def save(self, event=None, data={}): def test_assigment_and_deletion(self): self.save() event = self.session.query(self.Event).first() - assert event.location.name == 'Some location' - data = { - 'name': 'Some event' - } + assert event.location.name == "Some location" + data = {"name": "Some event"} form = self.EventForm(MultiDict(data)) form.validate() form.populate_obj(event) @@ -75,17 +73,16 @@ class Meta: self.EventForm = EventForm with raises(TypeError): - self.save(data={ - 'name': 'Some event', - 'unknown_field-name': 'Some location', - }) + self.save( + data={ + "name": "Some event", + "unknown_field-name": "Some location", + } + ) def test_updating_related_object(self): event = self.save() location_id = event.location.id - self.save( - event, - {'name': 'some name', 'location-name': u'Some other location'} - ) - assert event.name == 'some name' + self.save(event, {"name": "some name", "location-name": "Some other location"}) + assert event.name == "some name" assert event.location.id == location_id diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index 3d994ce..6ffffe4 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -11,7 +11,7 @@ class TestCase(object): def setup_method(self, method): - self.engine = create_engine('sqlite:///:memory:') + self.engine = create_engine("sqlite:///:memory:") self.Base = declarative_base() self.create_models() @@ -27,38 +27,35 @@ def teardown_method(self, method): def create_models(self): class User(self.Base): - __tablename__ = 'user' + __tablename__ = "user" id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) name = sa.Column(sa.Unicode(255)) - phone_number = sa.Column( - phone_number.PhoneNumberType(country_code='FI') - ) + phone_number = sa.Column(phone_number.PhoneNumberType(country_code="FI")) self.User = User -@mark.xfail('phone_number.phonenumbers is None') +@mark.xfail("phone_number.phonenumbers is None") class TestPhoneNumbers(TestCase): - ''' + """ Simple tests to ensure that sqlalchemy_utils.PhoneNumber, wtforms_alchemy.PhoneNumberType and sqlalchemy_utils.PhoneNumberField work nicely together. - ''' + """ + def setup_method(self, method): super(TestPhoneNumbers, self).setup_method(method) class UserForm(ModelForm): class Meta: model = self.User + self.UserForm = UserForm super(TestPhoneNumbers, self).setup_method(method) - self.phone_number = phone_number.PhoneNumber( - '040 1234567', - 'FI' - ) + self.phone_number = phone_number.PhoneNumber("040 1234567", "FI") self.user = self.User() - self.user.name = u'Someone' + self.user.name = "Someone" self.user.phone_number = self.phone_number self.session.add(self.user) self.session.commit() @@ -69,27 +66,21 @@ def test_query_returns_phone_number_object(self): def test_phone_number_is_stored_as_string(self): result = self.session.execute( - sa.text('SELECT phone_number FROM user WHERE id=:param'), - {'param': self.user.id} + sa.text("SELECT phone_number FROM user WHERE id=:param"), + {"param": self.user.id}, ) - assert result.first()[0] == u'+358401234567' + assert result.first()[0] == "+358401234567" def test_phone_number_in_form(self): - form = self.UserForm(MultiDict( - name=u'Matti Meikalainen', - phone_number='+358401231233' - )) + form = self.UserForm( + MultiDict(name="Matti Meikalainen", phone_number="+358401231233") + ) form.validate() assert len(form.errors) == 0 - assert form.data['phone_number'] == ( - phone_number.PhoneNumber('+358401231233') - ) + assert form.data["phone_number"] == (phone_number.PhoneNumber("+358401231233")) def test_empty_phone_number_in_form(self): - form = self.UserForm(MultiDict( - name=u'Matti Meikalainen', - phone_number='' - )) + form = self.UserForm(MultiDict(name="Matti Meikalainen", phone_number="")) form.validate() assert len(form.errors) == 0 - assert form.data['phone_number'] is None + assert form.data["phone_number"] is None diff --git a/tests/test_phone_number_field.py b/tests/test_phone_number_field.py index dcc9d49..828f0e2 100644 --- a/tests/test_phone_number_field.py +++ b/tests/test_phone_number_field.py @@ -8,118 +8,87 @@ class TestPhoneNumberField(object): def setup_method(self, method): self.valid_phone_numbers = [ - '040 1234567', - '+358 401234567', - '09 2501234', - '+358 92501234', - '0800 939393', - '09 4243 0456', - '0600 900 500' - ] - self.invalid_phone_numbers = [ - 'abc', - '+040 1234567', - '0111234567', - '358' + "040 1234567", + "+358 401234567", + "09 2501234", + "+358 92501234", + "0800 939393", + "09 4243 0456", + "0600 900 500", ] + self.invalid_phone_numbers = ["abc", "+040 1234567", "0111234567", "358"] def init_form(self, **kwargs): class TestForm(Form): phone_number = PhoneNumberField(**kwargs) + return TestForm def test_valid_phone_numbers(self): - form_class = self.init_form(region='FI') + form_class = self.init_form(region="FI") for phone_number in self.valid_phone_numbers: form = form_class(MultiDict(phone_number=phone_number)) form.validate() assert len(form.errors) == 0 def test_invalid_phone_numbers(self): - form_class = self.init_form(region='FI') + form_class = self.init_form(region="FI") for phone_number in self.invalid_phone_numbers: form = form_class(MultiDict(phone_number=phone_number)) form.validate() - assert len(form.errors['phone_number']) == 1 + assert len(form.errors["phone_number"]) == 1 def test_render_empty_phone_number_value(self): - form_class = self.init_form(region='FI') - form = form_class(MultiDict(phone_number='')) + form_class = self.init_form(region="FI") + form = form_class(MultiDict(phone_number="")) assert 'value=""' in form.phone_number() def test_empty_phone_number_value_passed_as_none(self): - form_class = self.init_form(region='FI') - form = form_class(MultiDict(phone_number='')) + form_class = self.init_form(region="FI") + form = form_class(MultiDict(phone_number="")) form.validate() assert len(form.errors) == 0 - assert form.data['phone_number'] is None + assert form.data["phone_number"] is None def test_default_display_format(self): - form_class = self.init_form(region='FI') - form = form_class(MultiDict(phone_number='+358401234567')) + form_class = self.init_form(region="FI") + form = form_class(MultiDict(phone_number="+358401234567")) assert 'value="040 1234567"' in form.phone_number() def test_international_display_format(self): - form_class = self.init_form( - region='FI', - display_format='international' - ) - form = form_class(MultiDict(phone_number='0401234567')) + form_class = self.init_form(region="FI", display_format="international") + form = form_class(MultiDict(phone_number="0401234567")) assert 'value="+358 40 1234567"' in form.phone_number() def test_e164_display_format(self): - form_class = self.init_form( - region='FI', - display_format='e164' - ) - form = form_class(MultiDict(phone_number='0401234567')) + form_class = self.init_form(region="FI", display_format="e164") + form = form_class(MultiDict(phone_number="0401234567")) assert 'value="+358401234567"' in form.phone_number() def test_field_rendering_when_invalid_phone_number(self): form_class = self.init_form() - form = form_class(MultiDict(phone_number='invalid')) + form = form_class(MultiDict(phone_number="invalid")) form.validate() assert 'value="invalid"' in form.phone_number() @pytest.mark.parametrize( - 'number,error_msg,check_value', + "number,error_msg,check_value", ( - ( - '', - 'This field is required.', - lambda v, orig: v is None - ), - ( - '1', - 'Not a valid phone number value', - lambda v, orig: v is not None - ), - ( - '123', - 'Not a valid phone number value', - lambda v, orig: v is not None - ), - ( - '+46123456789', - None, - lambda v, orig: v.e164 == orig - ), - ) + ("", "This field is required.", lambda v, orig: v is None), + ("1", "Not a valid phone number value", lambda v, orig: v is not None), + ("123", "Not a valid phone number value", lambda v, orig: v is not None), + ("+46123456789", None, lambda v, orig: v.e164 == orig), + ), ) def test_required_phone_number_form(self, number, error_msg, check_value): class PhoneNumberForm(Form): - phone = PhoneNumberField( - 'Phone number', - validators=[DataRequired()] - ) + phone = PhoneNumberField("Phone number", validators=[DataRequired()]) - form = PhoneNumberForm(MultiDict( - phone=number - )) + form = PhoneNumberForm(MultiDict(phone=number)) form.validate() if error_msg: assert len(form.errors) == 1 - assert form.errors['phone'][0] == error_msg + assert form.errors["phone"][0] == error_msg else: assert len(form.errors) == 0 assert check_value(form.phone.data, number) is True diff --git a/tests/test_query_select_field.py b/tests/test_query_select_field.py index 1ec10ae..8e7f637 100644 --- a/tests/test_query_select_field.py +++ b/tests/test_query_select_field.py @@ -37,14 +37,14 @@ def __init__(self, **kwargs): class TestBase(object): def create_models(self): class Test(self.base): - __tablename__ = 'test' + __tablename__ = "test" id = sa.Column(sa.Integer, primary_key=True, nullable=False) name = sa.Column(sa.String, nullable=False) self.Test = Test class PKTest(self.base): - __tablename__ = 'pk_test' + __tablename__ = "pk_test" foobar = sa.Column(sa.String, primary_key=True, nullable=False) baz = sa.Column(sa.String, nullable=False) @@ -54,9 +54,9 @@ def __str__(self): self.PKTest = PKTest def _fill(self, sess): - for i, n in [(1, 'apple'), (2, 'banana')]: + for i, n in [(1, "apple"), (2, "banana")]: s = self.Test(id=i, name=n) - p = self.PKTest(foobar='hello%s' % (i, ), baz=n) + p = self.PKTest(foobar="hello%s" % (i,), baz=n) sess.add(s) sess.add(p) sess.flush() @@ -65,7 +65,7 @@ def _fill(self, sess): class TestQuerySelectField(TestBase): def setup_method(self): - self.engine = sa.create_engine('sqlite:///:memory:', echo=False) + self.engine = sa.create_engine("sqlite:///:memory:", echo=False) self.base = declarative_base() self.create_models() @@ -85,21 +85,20 @@ def test_without_factory(self): class F(Form): a = QuerySelectField( - get_label='name', - widget=LazySelect(), - get_pk=lambda x: x.id + get_label="name", widget=LazySelect(), get_pk=lambda x: x.id ) - form = F(DummyPostData(a=['1'])) + + form = F(DummyPostData(a=["1"])) form.a.query = self.session.query(self.Test) assert form.a.data is not None assert form.a.data.id, 1 - assert form.a(), [('1', 'apple', True), ('2', 'banana', False)] + assert form.a(), [("1", "apple", True), ("2", "banana", False)] assert form.validate() - form = F(a=self.session.query(self.Test).filter_by(name='banana').first()) - form.a.query = self.session.query(self.Test).filter(self.Test.name != 'banana') + form = F(a=self.session.query(self.Test).filter_by(name="banana").first()) + form.a.query = self.session.query(self.Test).filter(self.Test.name != "banana") assert not form.validate() - assert form.a.errors, ['Not a valid choice'] + assert form.a.errors, ["Not a valid choice"] # Test query with no results form = F() @@ -117,22 +116,22 @@ class F(Form): a = QuerySelectField( get_label=(lambda model: model.name), query_factory=lambda: self.session.query(self.Test), - widget=LazySelect() + widget=LazySelect(), ) b = QuerySelectField( allow_blank=True, query_factory=lambda: self.session.query(self.PKTest), - widget=LazySelect() + widget=LazySelect(), ) form = F() assert form.a.data is None - assert form.a() == [('1', 'apple', False), ('2', 'banana', False)] + assert form.a() == [("1", "apple", False), ("2", "banana", False)] assert form.b.data is None assert form.b() == [ - ('__None', '', True), - ('hello1', 'apple', False), - ('hello2', 'banana', False) + ("__None", "", True), + ("hello1", "apple", False), + ("hello2", "banana", False), ] assert not form.validate() @@ -145,38 +144,40 @@ class F(Form): ) assert form.a() == [] - form = F(DummyPostData(a=['1'], b=['hello2'])) + form = F(DummyPostData(a=["1"], b=["hello2"])) assert form.a.data.id == 1 - assert form.a() == [('1', 'apple', True), ('2', 'banana', False)] - assert form.b.data.baz == 'banana' + assert form.a() == [("1", "apple", True), ("2", "banana", False)] + assert form.b.data.baz == "banana" assert form.b() == [ - ('__None', '', False), - ('hello1', 'apple', False), - ('hello2', 'banana', True) + ("__None", "", False), + ("hello1", "apple", False), + ("hello2", "banana", True), ] assert form.validate() # Make sure the query is cached - self.session.add(self.Test(id=3, name='meh')) + self.session.add(self.Test(id=3, name="meh")) self.session.flush() self.session.commit() - assert form.a() == [('1', 'apple', True), ('2', 'banana', False)] + assert form.a() == [("1", "apple", True), ("2", "banana", False)] form.a._object_list = None assert form.a() == [ - ('1', 'apple', True), ('2', 'banana', False), ('3', 'meh', False) + ("1", "apple", True), + ("2", "banana", False), + ("3", "meh", False), ] # Test bad data - form = F(DummyPostData(b=['__None'], a=['fail'])) + form = F(DummyPostData(b=["__None"], a=["fail"])) assert not form.validate() - assert form.a.errors == ['Not a valid choice'] + assert form.a.errors == ["Not a valid choice"] assert form.b.errors == [] assert form.b.data is None class TestQuerySelectMultipleField(TestBase): def setup_method(self): - self.engine = sa.create_engine('sqlite:///:memory:', echo=False) + self.engine = sa.create_engine("sqlite:///:memory:", echo=False) self.base = declarative_base() self.create_models() @@ -194,27 +195,27 @@ def teardown_method(self): self.engine.dispose() class F(Form): - a = QuerySelectMultipleField(get_label='name', widget=LazySelect()) + a = QuerySelectMultipleField(get_label="name", widget=LazySelect()) def test_unpopulated_default(self): form = self.F() assert [] == form.a.data def test_single_value_without_factory(self): - form = self.F(DummyPostData(a=['1'])) + form = self.F(DummyPostData(a=["1"])) form.a.query = self.session.query(self.Test) assert [1] == [v.id for v in form.a.data] - assert form.a() == [('1', 'apple', True), ('2', 'banana', False)] + assert form.a() == [("1", "apple", True), ("2", "banana", False)] assert form.validate() def test_multiple_values_without_query_factory(self): - form = self.F(DummyPostData(a=['1', '2'])) + form = self.F(DummyPostData(a=["1", "2"])) form.a.query = self.session.query(self.Test) assert [1, 2] == [v.id for v in form.a.data] - assert form.a() == [('1', 'apple', True), ('2', 'banana', True)] + assert form.a() == [("1", "apple", True), ("2", "banana", True)] assert form.validate() - form = self.F(DummyPostData(a=['1', '3'])) + form = self.F(DummyPostData(a=["1", "3"])) form.a.query = self.session.query(self.Test) assert [x.id for x in form.a.data], [1] assert not form.validate() @@ -224,14 +225,15 @@ def test_single_default_value(self): class F(Form): a = QuerySelectMultipleField( - get_label='name', + get_label="name", default=[first_test], widget=LazySelect(), - query_factory=lambda: self.session.query(self.Test) + query_factory=lambda: self.session.query(self.Test), ) + form = F() assert [v.id for v in form.a.data], [2] - assert form.a(), [('1', 'apple', False), ('2', 'banana', True)] + assert form.a(), [("1", "apple", False), ("2", "banana", True)] assert form.validate() def test_empty_query(self): @@ -247,7 +249,7 @@ def test_empty_query(self): class DatabaseTestCase(object): def setup_method(self, method): - self.engine = sa.create_engine('sqlite:///:memory:') + self.engine = sa.create_engine("sqlite:///:memory:") self.base = declarative_base() self.create_models() @@ -264,44 +266,46 @@ def teardown_method(self, method): def create_models(self): class City(self.base): - __tablename__ = 'city' + __tablename__ = "city" id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.String) country = sa.Column(sa.String) - state_id = sa.Column(sa.Integer, sa.ForeignKey('state.id')) + state_id = sa.Column(sa.Integer, sa.ForeignKey("state.id")) self.City = City class State(self.base): - __tablename__ = 'state' + __tablename__ = "state" id = sa.Column(sa.Integer, primary_key=True) - cities = sa.orm.relationship('City') + cities = sa.orm.relationship("City") self.State = State def create_cities(self): - self.session.add_all([ - self.City(name='Helsinki', country='Finland'), - self.City(name='Vantaa', country='Finland'), - self.City(name='New York', country='USA'), - self.City(name='Washington', country='USA'), - self.City(name='Stockholm', country='Sweden'), - ]) + self.session.add_all( + [ + self.City(name="Helsinki", country="Finland"), + self.City(name="Vantaa", country="Finland"), + self.City(name="New York", country="USA"), + self.City(name="Washington", country="USA"), + self.City(name="Stockholm", country="Sweden"), + ] + ) class TestGroupedQuerySelectField(DatabaseTestCase): def create_form(self, **kwargs): - query = self.session.query(self.City).order_by('name', 'country') + query = self.session.query(self.City).order_by("name", "country") class MyForm(Form): city = GroupedQuerySelectField( - label=kwargs.get('label', 'City'), - query_factory=kwargs.get('query_factory', lambda: query), - get_label=kwargs.get('get_label', lambda c: c.name), - get_group=kwargs.get('get_group', lambda c: c.country), - allow_blank=kwargs.get('allow_blank', False), - blank_text=kwargs.get('blank_text', ''), - blank_value=kwargs.get('blank_value', '__None'), + label=kwargs.get("label", "City"), + query_factory=kwargs.get("query_factory", lambda: query), + get_label=kwargs.get("get_label", lambda c: c.name), + get_group=kwargs.get("get_group", lambda c: c.country), + allow_blank=kwargs.get("allow_blank", False), + blank_text=kwargs.get("blank_text", ""), + blank_value=kwargs.get("blank_value", "__None"), ) return MyForm @@ -309,49 +313,45 @@ class MyForm(Form): def test_custom_none_value(self): self.create_cities() MyForm = self.create_form( - allow_blank=True, - blank_text='Choose city...', - blank_value='' + allow_blank=True, blank_text="Choose city...", blank_value="" ) - form = MyForm(DummyPostData({'city': ''})) + form = MyForm(DummyPostData({"city": ""})) assert form.validate(), form.errors - assert '' in ( - str(form.city) - ) + assert '' in (str(form.city)) def test_rendering(self): MyForm = self.create_form() self.create_cities() - assert str(MyForm().city).replace('\n', '') == ( + assert str(MyForm().city).replace("\n", "") == ( '' + "" + "" ) class TestGroupedQuerySelectMultipleField(DatabaseTestCase): def create_form(self, **kwargs): - query = self.session.query(self.City).order_by('name', 'country') + query = self.session.query(self.City).order_by("name", "country") class MyForm(ModelForm): class Meta: model = self.State cities = GroupedQuerySelectMultipleField( - label=kwargs.get('label', 'City'), - query_factory=kwargs.get('query_factory', lambda: query), - get_label=kwargs.get('get_label', lambda c: c.name), - get_group=kwargs.get('get_group', lambda c: c.country), - blank_text=kwargs.get('blank_text', ''), + label=kwargs.get("label", "City"), + query_factory=kwargs.get("query_factory", lambda: query), + get_label=kwargs.get("get_label", lambda c: c.name), + get_group=kwargs.get("get_group", lambda c: c.country), + blank_text=kwargs.get("blank_text", ""), ) return MyForm @@ -365,7 +365,7 @@ def test_single_value_without_factory(self): obj = self.State() MyForm = self.create_form() self.create_cities() - form = MyForm(DummyPostData(cities=['1']), obj=obj) + form = MyForm(DummyPostData(cities=["1"]), obj=obj) assert [1] == [v.id for v in form.cities.data] assert form.validate() form.populate_obj(obj) @@ -375,7 +375,7 @@ def test_multiple_values_without_query_factory(self): obj = self.State() MyForm = self.create_form() self.create_cities() - form = MyForm(DummyPostData(cities=['1', '2']), obj=obj) + form = MyForm(DummyPostData(cities=["1", "2"]), obj=obj) form.cities.query = self.session.query(self.City) assert [1, 2] == [v.id for v in form.cities.data] @@ -383,7 +383,7 @@ def test_multiple_values_without_query_factory(self): form.populate_obj(obj) assert [city.id for city in obj.cities] == [1, 2] - form = MyForm(DummyPostData(cities=['1', '666'])) + form = MyForm(DummyPostData(cities=["1", "666"])) form.cities.query = self.session.query(self.City) assert not form.validate() assert [x.id for x in form.cities.data] == [1] @@ -391,7 +391,7 @@ def test_multiple_values_without_query_factory(self): form.populate_obj(obj) assert [city.id for city in obj.cities] == [1] - form = MyForm(DummyPostData(cities=['666'])) + form = MyForm(DummyPostData(cities=["666"])) form.cities.query = self.session.query(self.City) assert not form.validate() assert [x.id for x in form.cities.data] == [] @@ -402,17 +402,17 @@ def test_multiple_values_without_query_factory(self): def test_rendering(self): MyForm = self.create_form() self.create_cities() - assert str(MyForm().cities).replace('\n', '') == ( + assert str(MyForm().cities).replace("\n", "") == ( '' + "" + "" ) diff --git a/tests/test_select_field.py b/tests/test_select_field.py index 64e060e..a8c6b92 100644 --- a/tests/test_select_field.py +++ b/tests/test_select_field.py @@ -14,73 +14,66 @@ def getlist(self, key): class TestSelectFieldDefaultValue(ModelFormTestCase): def test_option_selected_by_field_default_value(self): - choices = [(u'1', '1'), (u'2', '2')] - self.init( - type_=sa.Integer, - default=u'1', - info={'choices': choices} - ) - form = self.form_class(MultiDict({'test_column': '2'})) - assert ( - '' in - str(form.test_column) - ) + choices = [("1", "1"), ("2", "2")] + self.init(type_=sa.Integer, default="1", info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": "2"})) + assert '' in str(form.test_column) class TestSelectFieldCoerce(ModelFormTestCase): def test_integer_coerces_values_to_integers(self): - choices = [(u'1', '1'), (u'2', '2')] - self.init(type_=sa.Integer, info={'choices': choices}) - form = self.form_class(MultiDict({'test_column': '2'})) + choices = [("1", "1"), ("2", "2")] + self.init(type_=sa.Integer, info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": "2"})) assert form.test_column.data == 2 def test_nullable_integer_coerces_values_to_integers(self): - choices = [(u'1', '1'), (u'2', '2')] - self.init(type_=sa.Integer, nullable=True, info={'choices': choices}) - form = self.form_class(MultiDict({'test_column': '2'})) + choices = [("1", "1"), ("2", "2")] + self.init(type_=sa.Integer, nullable=True, info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": "2"})) assert form.test_column.data == 2 def test_integer_coerces_empty_strings_to_nulls(self): - choices = [(u'1', '1'), (u'2', '2')] - self.init(type_=sa.Integer, info={'choices': choices}) - form = self.form_class(MultiDict({'test_column': ''})) + choices = [("1", "1"), ("2", "2")] + self.init(type_=sa.Integer, info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": ""})) assert form.test_column.data is None def test_big_integer_coerces_values_to_integers(self): - choices = [(u'1', '1'), (u'2', '2')] - self.init(type_=sa.BigInteger, info={'choices': choices}) - self.assert_type('test_column', SelectField) - form = self.form_class(MultiDict({'test_column': '2'})) + choices = [("1", "1"), ("2", "2")] + self.init(type_=sa.BigInteger, info={"choices": choices}) + self.assert_type("test_column", SelectField) + form = self.form_class(MultiDict({"test_column": "2"})) assert form.test_column.data == 2 def test_small_integer_coerces_values_to_integers(self): - choices = [(u'1', '1'), (u'2', '2')] - self.init(type_=sa.SmallInteger, info={'choices': choices}) - form = self.form_class(MultiDict({'test_column': '2'})) + choices = [("1", "1"), ("2", "2")] + self.init(type_=sa.SmallInteger, info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": "2"})) assert form.test_column.data == 2 def test_numeric_coerces_values_to_decimals(self): - choices = [(u'1.0', '1.0'), (u'2.0', '2.0')] - self.init(type_=sa.Numeric, info={'choices': choices}) - form = self.form_class(MultiDict({'test_column': '2.0'})) - assert form.test_column.data == Decimal('2.0') + choices = [("1.0", "1.0"), ("2.0", "2.0")] + self.init(type_=sa.Numeric, info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": "2.0"})) + assert form.test_column.data == Decimal("2.0") def test_float_coerces_values_to_floats(self): - choices = [(u'1.0', '1.0'), (u'2.0', '2.0')] - self.init(type_=sa.Float, info={'choices': choices}) - form = self.form_class(MultiDict({'test_column': '2.0'})) + choices = [("1.0", "1.0"), ("2.0", "2.0")] + self.init(type_=sa.Float, info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": "2.0"})) assert form.test_column.data == 2.0 def test_unicode_coerces_values_to_unicode_strings(self): - choices = [('1.0', '1.0'), ('2.0', '2.0')] - self.init(type_=sa.Unicode(255), info={'choices': choices}) - form = self.form_class(MultiDict({'test_column': '2.0'})) - assert form.test_column.data == u'2.0' + choices = [("1.0", "1.0"), ("2.0", "2.0")] + self.init(type_=sa.Unicode(255), info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": "2.0"})) + assert form.test_column.data == "2.0" assert isinstance(form.test_column.data, six.text_type) def test_unicode_text_coerces_values_to_unicode_strings(self): - choices = [('1.0', '1.0'), ('2.0', '2.0')] - self.init(type_=sa.UnicodeText, info={'choices': choices}) - form = self.form_class(MultiDict({'test_column': '2.0'})) - assert form.test_column.data == u'2.0' + choices = [("1.0", "1.0"), ("2.0", "2.0")] + self.init(type_=sa.UnicodeText, info={"choices": choices}) + form = self.form_class(MultiDict({"test_column": "2.0"})) + assert form.test_column.data == "2.0" assert isinstance(form.test_column.data, six.text_type) diff --git a/tests/test_synonym.py b/tests/test_synonym.py index cc72d4b..17c6b1b 100644 --- a/tests/test_synonym.py +++ b/tests/test_synonym.py @@ -8,9 +8,9 @@ class TestSynonym(ModelFormTestCase): def test_synonym_returning_column_property_with_include(self): class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" id = sa.Column(sa.Integer, primary_key=True) - _test_column = sa.Column('test_column', sa.Integer, nullable=False) + _test_column = sa.Column("test_column", sa.Integer, nullable=False) @hybrid_property def test_column_hybrid(self): @@ -20,24 +20,24 @@ def test_column_hybrid(self): def test_column_hybrid(self, value): self._test_column = value - test_column = sa.orm.synonym('_test_column') + test_column = sa.orm.synonym("_test_column") class ModelTestForm(ModelForm): class Meta: model = ModelTest not_null_str_validator = None not_null_validator = None - include = ('test_column', ) - exclude = ('_test_column', ) + include = ("test_column",) + exclude = ("_test_column",) form = ModelTestForm() assert form.test_column def test_synonym_returning_column_property_with_only(self): class ModelTest(self.base): - __tablename__ = 'model_test' + __tablename__ = "model_test" id = sa.Column(sa.Integer, primary_key=True) - _test_column = sa.Column('test_column', sa.Integer, nullable=False) + _test_column = sa.Column("test_column", sa.Integer, nullable=False) @hybrid_property def test_column_hybrid(self): @@ -47,14 +47,14 @@ def test_column_hybrid(self): def test_column_hybrid(self, value): self._test_column = value - test_column = sa.orm.synonym('_test_column') + test_column = sa.orm.synonym("_test_column") class ModelTestForm(ModelForm): class Meta: model = ModelTest not_null_str_validator = None not_null_validator = None - only = ('test_column', ) + only = ("test_column",) form = ModelTestForm() assert form.test_column diff --git a/tests/test_types.py b/tests/test_types.py index 15cd811..f056bb1 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -54,7 +54,7 @@ class UnknownType(sa.types.UserDefinedType): def get_col_spec(self): - return 'UNKNOWN()' + return "UNKNOWN()" class CustomUnicodeTextType(sa.types.TypeDecorator): @@ -82,47 +82,47 @@ def test_raises_exception_for_array_type(self): def test_unicode_converts_to_text_field(self): self.init() - self.assert_type('test_column', StringField) + self.assert_type("test_column", StringField) def test_custom_unicode_converts_to_text_field(self): self.init(type_=CustomUnicodeType) - self.assert_type('test_column', StringField) + self.assert_type("test_column", StringField) def test_string_converts_to_text_field(self): self.init(type_=sa.String) - self.assert_type('test_column', StringField) + self.assert_type("test_column", StringField) def test_integer_converts_to_integer_field(self): self.init(type_=sa.Integer) - self.assert_type('test_column', IntegerField) + self.assert_type("test_column", IntegerField) def test_unicode_text_converts_to_text_area_field(self): self.init(type_=sa.UnicodeText) - self.assert_type('test_column', TextAreaField) + self.assert_type("test_column", TextAreaField) def test_custom_unicode_text_converts_to_text_area_field(self): self.init(type_=CustomUnicodeTextType) - self.assert_type('test_column', TextAreaField) + self.assert_type("test_column", TextAreaField) def test_boolean_converts_to_boolean_field(self): self.init(type_=sa.Boolean) - self.assert_type('test_column', BooleanField) + self.assert_type("test_column", BooleanField) def test_datetime_converts_to_datetime_field(self): self.init(type_=sa.DateTime) - self.assert_type('test_column', DateTimeField) + self.assert_type("test_column", DateTimeField) def test_date_converts_to_date_field(self): self.init(type_=sa.Date) - self.assert_type('test_column', DateField) + self.assert_type("test_column", DateField) def test_float_converts_to_float_field(self): self.init(type_=sa.Float) - self.assert_type('test_column', FloatField) + self.assert_type("test_column", FloatField) def test_numeric_converts_to_decimal_field(self): self.init(type_=sa.Numeric) - self.assert_type('test_column', DecimalField) + self.assert_type("test_column", DecimalField) def test_numeric_scale_converts_to_decimal_field_scale(self): self.init(type_=sa.Numeric(scale=4)) @@ -131,133 +131,131 @@ def test_numeric_scale_converts_to_decimal_field_scale(self): def test_custom_numeric_converts_to_decimal_field(self): self.init(type_=CustomNumericType) - self.assert_type('test_column', DecimalField) + self.assert_type("test_column", DecimalField) def test_enum_field_converts_to_select_field(self): - choices = ['1', '2'] + choices = ["1", "2"] self.init(type_=sa.Enum(*choices)) - self.assert_type('test_column', SelectField) + self.assert_type("test_column", SelectField) form = self.form_class() assert form.test_column.choices == [(s, s) for s in choices] def test_nullable_enum_uses_null_or_unicode_coerce_func_by_default(self): - choices = ['1', '2'] + choices = ["1", "2"] self.init(type_=sa.Enum(*choices), nullable=True) - field = self._get_field('test_column') + field = self._get_field("test_column") assert field.coerce == null_or_unicode def test_custom_choices_override_enum_choices(self): - choices = ['1', '2'] - custom_choices = [('2', '2'), ('3', '3')] - self.init(type_=sa.Enum(*choices), info={'choices': custom_choices}) + choices = ["1", "2"] + custom_choices = [("2", "2"), ("3", "3")] + self.init(type_=sa.Enum(*choices), info={"choices": custom_choices}) form = self.form_class() assert form.test_column.choices == custom_choices def test_column_with_choices_converts_to_select_field(self): - choices = [(u'1', '1'), (u'2', '2')] - self.init(type_=sa.Integer, info={'choices': choices}) - self.assert_type('test_column', SelectField) + choices = [("1", "1"), ("2", "2")] + self.init(type_=sa.Integer, info={"choices": choices}) + self.assert_type("test_column", SelectField) form = self.form_class() assert form.test_column.choices == choices def test_assigns_email_validator_for_email_type(self): self.init(type_=EmailType) - self.assert_has_validator('test_column', Email) + self.assert_has_validator("test_column", Email) def test_assigns_url_validator_for_url_type(self): self.init(type_=URLType) - self.assert_has_validator('test_column', URL) + self.assert_has_validator("test_column", URL) def test_time_converts_to_time_field(self): self.init(type_=sa.types.Time) - self.assert_type('test_column', TimeField) + self.assert_type("test_column", TimeField) def test_varchar_converts_to_text_field(self): self.init(type_=sa.types.VARCHAR) - self.assert_type('test_column', StringField) + self.assert_type("test_column", StringField) def test_text_converts_to_textarea_field(self): self.init(type_=sa.types.TEXT) - self.assert_type('test_column', TextAreaField) + self.assert_type("test_column", TextAreaField) def test_char_converts_to_text_field(self): self.init(type_=sa.types.CHAR) - self.assert_type('test_column', StringField) + self.assert_type("test_column", StringField) def test_real_converts_to_float_field(self): self.init(type_=sa.types.REAL) - self.assert_type('test_column', FloatField) + self.assert_type("test_column", FloatField) def test_json_converts_to_textarea_field(self): self.init(type_=sa.types.JSON) - self.assert_type('test_column', TextAreaField) + self.assert_type("test_column", TextAreaField) - @mark.xfail('phone_number.phonenumbers is None') + @mark.xfail("phone_number.phonenumbers is None") def test_phone_number_converts_to_phone_number_field(self): self.init(type_=PhoneNumberType) - self.assert_type('test_column', PhoneNumberField) + self.assert_type("test_column", PhoneNumberField) - @mark.xfail('phone_number.phonenumbers is None') + @mark.xfail("phone_number.phonenumbers is None") def test_phone_number_country_code_passed_to_field(self): - self.init(type_=PhoneNumberType(region='SE')) + self.init(type_=PhoneNumberType(region="SE")) form = self.form_class() - assert form.test_column.region == 'SE' + assert form.test_column.region == "SE" - @mark.xfail('phone_number.phonenumbers is None') + @mark.xfail("phone_number.phonenumbers is None") def test_phone_number_type_has_no_length_validation(self): - self.init(type_=PhoneNumberType(country_code='FI')) - field = self._get_field('test_column') + self.init(type_=PhoneNumberType(country_code="FI")) + field = self._get_field("test_column") for validator in field.validators: assert validator.__class__ != Length - @mark.parametrize(('type', 'field'), ( - (IntRangeType, IntIntervalField), - )) + @mark.parametrize(("type", "field"), ((IntRangeType, IntIntervalField),)) def test_range_type_conversion(self, type, field): self.init(type_=type) - self.assert_type('test_column', field) + self.assert_type("test_column", field) - @mark.xfail('passlib is None') + @mark.xfail("passlib is None") def test_password_type_converts_to_password_field(self): self.init(type_=PasswordType) - self.assert_type('test_column', PasswordField) + self.assert_type("test_column", PasswordField) - @mark.xfail('arrow.arrow is None') + @mark.xfail("arrow.arrow is None") def test_arrow_type_converts_to_datetime_field(self): self.init(type_=arrow.ArrowType) - self.assert_type('test_column', DateTimeField) + self.assert_type("test_column", DateTimeField) def test_url_type_converts_to_string_field(self): self.init(type_=URLType) - self.assert_type('test_column', StringField) + self.assert_type("test_column", StringField) def test_uuid_type_converst_to_uuid_type(self): self.init(type_=UUIDType) - self.assert_type('test_column', StringField) + self.assert_type("test_column", StringField) def test_color_type_converts_to_color_field(self): self.init(type_=ColorType) - self.assert_type('test_column', ColorField) + self.assert_type("test_column", ColorField) def test_email_type_converts_to_email_field(self): self.init(type_=EmailType) - self.assert_type('test_column', EmailField) + self.assert_type("test_column", EmailField) def test_country_type_converts_to_country_field(self): self.init(type_=CountryType) - self.assert_type('test_column', CountryField) + self.assert_type("test_column", CountryField) def test_choice_type_converts_to_select_field(self): - choices = [('1', 'choice 1'), ('2', 'choice 2')] + choices = [("1", "choice 1"), ("2", "choice 2")] self.init(type_=ChoiceType(choices)) - self.assert_type('test_column', SelectField) + self.assert_type("test_column", SelectField) assert list(self.form_class().test_column.choices) == choices def test_choice_type_uses_custom_coerce_func(self): - choices = [('1', 'choice 1'), ('2', 'choice 2')] + choices = [("1", "choice 1"), ("2", "choice 2")] self.init(type_=ChoiceType(choices)) - self.assert_type('test_column', SelectField) - model = self.ModelTest(test_column=u'2') + self.assert_type("test_column", SelectField) + model = self.ModelTest(test_column="2") form = self.form_class(obj=model) assert '