summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-10-21 17:24:14 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-10-21 17:24:14 -0400
commit233d9c1bc0d32020293356a420b56d32978d5c38 (patch)
tree1c6313242a261db9483ec9f78568fabf4258c73a
parentade27f35cb4911306404dcc74cce8bbf6f7d37bb (diff)
parentba951b99a6f3bd78a3a90546f0ae686d31c3bfc8 (diff)
downloadsqlalchemy-233d9c1bc0d32020293356a420b56d32978d5c38.tar.gz
Merge remote-tracking branch 'origin/pr/137' into pr137
-rw-r--r--lib/sqlalchemy/orm/util.py19
-rw-r--r--test/orm/test_cascade.py8
2 files changed, 20 insertions, 7 deletions
diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py
index 8d40ae21c..ad610a4ac 100644
--- a/lib/sqlalchemy/orm/util.py
+++ b/lib/sqlalchemy/orm/util.py
@@ -30,13 +30,10 @@ class CascadeOptions(frozenset):
'all', 'none', 'delete-orphan'])
_allowed_cascades = all_cascades
- def __new__(cls, arg):
- values = set([
- c for c
- in re.split('\s*,\s*', arg or "")
- if c
- ])
-
+ def __new__(cls, value_list):
+ if isinstance(value_list, str) or value_list is None:
+ return cls.from_string(value_list)
+ values = set(value_list)
if values.difference(cls._allowed_cascades):
raise sa_exc.ArgumentError(
"Invalid cascade option(s): %s" %
@@ -70,6 +67,14 @@ class CascadeOptions(frozenset):
",".join([x for x in sorted(self)])
)
+ @classmethod
+ def from_string(cls, arg):
+ values = [
+ c for c
+ in re.split('\s*,\s*', arg or "")
+ if c
+ ]
+ return cls(values)
def _validator_events(
desc, key, validator, include_removes, include_backrefs):
diff --git a/test/orm/test_cascade.py b/test/orm/test_cascade.py
index bd6a17286..e39911d0f 100644
--- a/test/orm/test_cascade.py
+++ b/test/orm/test_cascade.py
@@ -1,3 +1,4 @@
+import copy
from sqlalchemy.testing import assert_raises, assert_raises_message
from sqlalchemy import Integer, String, ForeignKey, Sequence, \
@@ -13,6 +14,7 @@ from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from test.orm import _fixtures
+
class CascadeArgTest(fixtures.MappedTest):
run_inserts = None
run_create_tables = None
@@ -85,6 +87,12 @@ class CascadeArgTest(fixtures.MappedTest):
orm_util.CascadeOptions("all, delete-orphan"),
frozenset)
+ def test_cascade_deepcopy(self):
+ old = orm_util.CascadeOptions("all, delete-orphan")
+ new = copy.deepcopy(old)
+ eq_(old, new)
+
+
def test_cascade_assignable(self):
User, Address = self.classes.User, self.classes.Address
users, addresses = self.tables.users, self.tables.addresses