[Sqlalchemy-commits] [5999] sqlalchemy/branches/rel_0_6: the light has been seen.
Brought to you by:
zzzeek
From: <co...@sq...> - 2009-05-30 18:27:22
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[5999] sqlalchemy/branches/rel_0_6: the light has been seen.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>5999</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2009-05-30 14:27:13 -0400 (Sat, 30 May 2009)</dd> </dl> <h3>Log Message</h3> <pre>the light has been seen. all tests pass 2k + 3k + new tests</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesrel_0_6libsqlalchemyormcollectionspy">sqlalchemy/branches/rel_0_6/lib/sqlalchemy/orm/collections.py</a></li> <li><a href="#sqlalchemybranchesrel_0_6testormcollectionpy">sqlalchemy/branches/rel_0_6/test/orm/collection.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesrel_0_6libsqlalchemyormcollectionspy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_6/lib/sqlalchemy/orm/collections.py (5998 => 5999)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_6/lib/sqlalchemy/orm/collections.py 2009-05-30 17:13:13 UTC (rev 5998) +++ sqlalchemy/branches/rel_0_6/lib/sqlalchemy/orm/collections.py 2009-05-30 18:27:13 UTC (rev 5999) </span><span class="lines">@@ -944,23 +944,22 @@ </span><span class="cx"> fn(self, index, value) </span><span class="cx"> else: </span><span class="cx"> # slice assignment requires __delitem__, insert, __len__ </span><del>- if index.stop is None: - stop = len(self) - elif index.stop < 0: - stop = len(self) + index.stop - else: - stop = index.stop - start = index.start or 0 </del><span class="cx"> step = index.step or 1 </span><del>- rng = range(start, stop, step) </del><ins>+ start = index.start or 0 + if start < 0: + start += len(self) + stop = index.stop or len(self) + if stop < 0: + stop += len(self) + </ins><span class="cx"> if step == 1: </span><del>- for i in rng: - del self[start] - i = start - for item in value: - self.insert(i, item) - i += 1 </del><ins>+ for i in xrange(start, stop, step): + del self[index.start or 0] + + for i, item in enumerate(value): + self.insert(i + start, item) </ins><span class="cx"> else: </span><ins>+ rng = range(start, stop, step) </ins><span class="cx"> if len(value) != len(rng): </span><span class="cx"> raise ValueError( </span><span class="cx"> "attempt to assign sequence of size %s to " </span></span></pre></div> <a id="sqlalchemybranchesrel_0_6testormcollectionpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_6/test/orm/collection.py (5998 => 5999)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_6/test/orm/collection.py 2009-05-30 17:13:13 UTC (rev 5998) +++ sqlalchemy/branches/rel_0_6/test/orm/collection.py 2009-05-30 18:27:13 UTC (rev 5999) </span><span class="lines">@@ -165,6 +165,13 @@ </span><span class="cx"> control[slice(0,-1)] = values </span><span class="cx"> assert_eq() </span><span class="cx"> </span><ins>+ values = [creator(),creator(),creator()] + control[:] = values + direct[:] = values + def invalid(): + direct[slice(0, 6, 2)] = [creator()] + self.assertRaises(ValueError, invalid) + </ins><span class="cx"> if hasattr(direct, '__delitem__'): </span><span class="cx"> e = creator() </span><span class="cx"> direct.append(e) </span><span class="lines">@@ -224,7 +231,18 @@ </span><span class="cx"> direct[1::2] = values </span><span class="cx"> control[1::2] = values </span><span class="cx"> assert_eq() </span><ins>+ + values = [creator(), creator()] + direct[-1:-3] = values + control[-1:-3] = values + assert_eq() </ins><span class="cx"> </span><ins>+ values = [creator(), creator()] + direct[-2:-1] = values + control[-2:-1] = values + assert_eq() + + </ins><span class="cx"> if hasattr(direct, '__delitem__') or hasattr(direct, '__delslice__'): </span><span class="cx"> for i in range(1, 4): </span><span class="cx"> e = creator() </span><span class="lines">@@ -1554,10 +1572,9 @@ </span><span class="cx"> collection_class = lambda: Ordered2(lambda v: (v.a, v.b)) </span><span class="cx"> self._test_composite_mapped(collection_class) </span><span class="cx"> </span><del>-# TODO: are these tests redundant vs. the above tests ? -# remove if so </del><span class="cx"> class CustomCollectionsTest(_base.MappedTest): </span><del>- </del><ins>+ """test the integration of collections with mapped classes.""" + </ins><span class="cx"> def define_tables(self, metadata): </span><span class="cx"> Table('sometable', metadata, </span><span class="cx"> Column('col1',Integer, primary_key=True), </span><span class="lines">@@ -1678,15 +1695,50 @@ </span><span class="cx"> replaced = set([id(b) for b in f.bars.values()]) </span><span class="cx"> self.assert_(existing != replaced) </span><span class="cx"> </span><ins>+ def test_list(self): + self._test_list(list) + + def test_list_no_setslice(self): + class ListLike(object): + def __init__(self): + self.data = list() + def append(self, item): + self.data.append(item) + def remove(self, item): + self.data.remove(item) + def insert(self, index, item): + self.data.insert(index, item) + def pop(self, index=-1): + return self.data.pop(index) + def extend(self): + assert False + def __len__(self): + return len(self.data) + def __setitem__(self, key, value): + self.data[key] = value + def __getitem__(self, key): + return self.data[key] + def __delitem__(self, key): + del self.data[key] + def __iter__(self): + return iter(self.data) + __hash__ = object.__hash__ + def __eq__(self, other): + return self.data == other + def __repr__(self): + return 'ListLike(%s)' % repr(self.data) + + self._test_list(ListLike) + </ins><span class="cx"> @testing.resolve_artifact_names </span><del>- def test_list(self): </del><ins>+ def _test_list(self, listcls): </ins><span class="cx"> class Parent(object): </span><span class="cx"> pass </span><span class="cx"> class Child(object): </span><span class="cx"> pass </span><span class="cx"> </span><span class="cx"> mapper(Parent, sometable, properties={ </span><del>- 'children':relation(Child, collection_class=list) </del><ins>+ 'children':relation(Child, collection_class=listcls) </ins><span class="cx"> }) </span><span class="cx"> mapper(Child, someothertable) </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |