summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--factory/base.py15
-rw-r--r--tests/__init__.py1
-rw-r--r--tests/test_deprecation.py49
3 files changed, 63 insertions, 2 deletions
diff --git a/factory/base.py b/factory/base.py
index 7db0c76..862556e 100644
--- a/factory/base.py
+++ b/factory/base.py
@@ -21,6 +21,7 @@
# THE SOFTWARE.
import logging
+import warnings
from . import containers
from . import declarations
@@ -109,11 +110,21 @@ class FactoryMetaClass(type):
attrs_meta = attrs.pop('Meta', None)
oldstyle_attrs = {}
+ converted_attrs = {}
for old_name, new_name in base_factory._OLDSTYLE_ATTRIBUTES.items():
if old_name in attrs:
- oldstyle_attrs[new_name] = attrs.pop(old_name)
+ oldstyle_attrs[old_name] = new_name
+ converted_attrs[new_name] = attrs.pop(old_name)
if oldstyle_attrs:
- attrs_meta = type('Meta', (object,), oldstyle_attrs)
+ warnings.warn(
+ "Declaring any of %s at class-level is deprecated"
+ " and will be removed in the future. Please set them"
+ " as %s attributes of a 'class Meta' attribute." % (
+ ', '.join(oldstyle_attrs.keys()),
+ ', '.join(oldstyle_attrs.values()),
+ ),
+ PendingDeprecationWarning, 2)
+ attrs_meta = type('Meta', (object,), converted_attrs)
base_meta = resolve_attribute('_meta', bases)
options_class = resolve_attribute('_options_class', bases, FactoryOptions)
diff --git a/tests/__init__.py b/tests/__init__.py
index 5b6fc55..855beea 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -4,6 +4,7 @@
from .test_base import *
from .test_containers import *
from .test_declarations import *
+from .test_deprecation import *
from .test_django import *
from .test_fuzzy import *
from .test_helpers import *
diff --git a/tests/test_deprecation.py b/tests/test_deprecation.py
new file mode 100644
index 0000000..bccc351
--- /dev/null
+++ b/tests/test_deprecation.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2010 Mark Sandstrom
+# Copyright (c) 2011-2013 Raphaƫl Barrois
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+"""Tests for deprecated features."""
+
+import warnings
+
+import factory
+
+from .compat import mock, unittest
+from . import tools
+
+
+class DeprecationTests(unittest.TestCase):
+ def test_factory_for(self):
+ class Foo(object):
+ pass
+
+ with warnings.catch_warnings(record=True) as w:
+ warnings.simplefilter('always')
+ class FooFactory(factory.Factory):
+ FACTORY_FOR = Foo
+
+ self.assertEqual(1, len(w))
+ warning = w[0]
+ # Message is indeed related to the current file
+ # This is to ensure error messages are readable by end users.
+ self.assertEqual(__file__, warning.filename)
+ self.assertIn('FACTORY_FOR', str(warning.message))
+ self.assertIn('target', str(warning.message))