229
229
eq_(key, (User, (1,)))
232
class PathRegistryTest(_fixtures.FixtureTest):
233
run_setup_mappers = 'once'
239
def setup_mappers(cls):
240
cls._setup_stock_mapping()
242
def test_root_registry(self):
243
umapper = inspect(self.classes.User)
245
util.RootRegistry()[umapper],
246
umapper._path_registry
249
util.RootRegistry()[umapper],
250
util.PathRegistry.coerce((umapper,))
253
def test_expand(self):
254
umapper = inspect(self.classes.User)
255
amapper = inspect(self.classes.Address)
256
path = PathRegistry.coerce((umapper,))
259
path[umapper.attrs.addresses][amapper]
260
[amapper.attrs.email_address],
261
PathRegistry.coerce((umapper, umapper.attrs.addresses,
262
amapper, amapper.attrs.email_address))
265
def test_entity_boolean(self):
266
umapper = inspect(self.classes.User)
267
path = PathRegistry.coerce((umapper,))
268
is_(bool(path), True)
270
def test_key_boolean(self):
271
umapper = inspect(self.classes.User)
272
path = PathRegistry.coerce((umapper, umapper.attrs.addresses))
273
is_(bool(path), True)
275
def test_aliased_class(self):
276
User = self.classes.User
278
ua_insp = inspect(ua)
279
path = PathRegistry.coerce((ua_insp, ua_insp.mapper.attrs.addresses))
280
assert path.parent.is_aliased_class
282
def test_indexed_entity(self):
283
umapper = inspect(self.classes.User)
284
amapper = inspect(self.classes.Address)
285
path = PathRegistry.coerce((umapper, umapper.attrs.addresses,
286
amapper, amapper.attrs.email_address))
287
is_(path[0], umapper)
288
is_(path[2], amapper)
290
def test_indexed_key(self):
291
umapper = inspect(self.classes.User)
292
amapper = inspect(self.classes.Address)
293
path = PathRegistry.coerce((umapper, umapper.attrs.addresses,
294
amapper, amapper.attrs.email_address))
295
eq_(path[1], umapper.attrs.addresses)
296
eq_(path[3], amapper.attrs.email_address)
298
def test_slice(self):
299
umapper = inspect(self.classes.User)
300
amapper = inspect(self.classes.Address)
301
path = PathRegistry.coerce((umapper, umapper.attrs.addresses,
302
amapper, amapper.attrs.email_address))
303
eq_(path[1:3], (umapper.attrs.addresses, amapper))
305
def test_addition(self):
306
umapper = inspect(self.classes.User)
307
amapper = inspect(self.classes.Address)
308
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
309
p2 = PathRegistry.coerce((amapper, amapper.attrs.email_address))
312
PathRegistry.coerce((umapper, umapper.attrs.addresses,
313
amapper, amapper.attrs.email_address))
316
def test_length(self):
317
umapper = inspect(self.classes.User)
318
amapper = inspect(self.classes.Address)
319
pneg1 = PathRegistry.coerce(())
320
p0 = PathRegistry.coerce((umapper,))
321
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
322
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
323
p3 = PathRegistry.coerce((umapper, umapper.attrs.addresses,
324
amapper, amapper.attrs.email_address))
338
umapper = inspect(self.classes.User)
339
amapper = inspect(self.classes.Address)
340
u_alias = inspect(aliased(self.classes.User))
341
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
342
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
343
p3 = PathRegistry.coerce((umapper, umapper.attrs.name))
344
p4 = PathRegistry.coerce((u_alias, umapper.attrs.addresses))
345
p5 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
346
p6 = PathRegistry.coerce((amapper, amapper.attrs.user, umapper,
347
umapper.attrs.addresses))
348
p7 = PathRegistry.coerce((amapper, amapper.attrs.user, umapper,
349
umapper.attrs.addresses,
350
amapper, amapper.attrs.email_address))
357
is_(p6 == p7.parent.parent, True)
364
def test_contains_mapper(self):
365
umapper = inspect(self.classes.User)
366
amapper = inspect(self.classes.Address)
367
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
368
assert p1.contains_mapper(umapper)
369
assert not p1.contains_mapper(amapper)
374
def _attributes(self):
379
umapper = inspect(self.classes.User)
380
amapper = inspect(self.classes.Address)
382
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
383
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
384
p3 = PathRegistry.coerce((amapper, amapper.attrs.email_address))
387
p1.path, (umapper, umapper.attrs.addresses)
390
p2.path, (umapper, umapper.attrs.addresses, amapper)
393
p3.path, (amapper, amapper.attrs.email_address)
396
def test_registry_set(self):
397
reg = self._registry()
398
umapper = inspect(self.classes.User)
399
amapper = inspect(self.classes.Address)
401
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
402
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
403
p3 = PathRegistry.coerce((amapper, amapper.attrs.email_address))
405
p1.set(reg, "p1key", "p1value")
406
p2.set(reg, "p2key", "p2value")
407
p3.set(reg, "p3key", "p3value")
411
('p1key', p1.path): 'p1value',
412
('p2key', p2.path): 'p2value',
413
('p3key', p3.path): 'p3value',
417
def test_registry_get(self):
418
reg = self._registry()
419
umapper = inspect(self.classes.User)
420
amapper = inspect(self.classes.Address)
422
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
423
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
424
p3 = PathRegistry.coerce((amapper, amapper.attrs.email_address))
427
('p1key', p1.path): 'p1value',
428
('p2key', p2.path): 'p2value',
429
('p3key', p3.path): 'p3value',
433
eq_(p1.get(reg, "p1key"), "p1value")
434
eq_(p2.get(reg, "p2key"), "p2value")
435
eq_(p2.get(reg, "p1key"), None)
436
eq_(p3.get(reg, "p3key"), "p3value")
437
eq_(p3.get(reg, "p1key"), None)
439
def test_registry_contains(self):
440
reg = self._registry()
441
umapper = inspect(self.classes.User)
442
amapper = inspect(self.classes.Address)
444
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
445
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
446
p3 = PathRegistry.coerce((amapper, amapper.attrs.email_address))
449
('p1key', p1.path): 'p1value',
450
('p2key', p2.path): 'p2value',
451
('p3key', p3.path): 'p3value',
454
assert p1.contains(reg, "p1key")
455
assert not p1.contains(reg, "p2key")
456
assert p3.contains(reg, "p3key")
457
assert not p2.contains(reg, "fake")
459
def test_registry_setdefault(self):
460
reg = self._registry()
461
umapper = inspect(self.classes.User)
462
amapper = inspect(self.classes.Address)
464
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
465
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
468
('p1key', p1.path): 'p1value',
472
p1.setdefault(reg, "p1key", "p1newvalue_a")
473
p1.setdefault(reg, "p1key_new", "p1newvalue_b")
474
p2.setdefault(reg, "p2key", "p2newvalue")
478
('p1key', p1.path): 'p1value',
479
('p1key_new', p1.path): 'p1newvalue_b',
480
('p2key', p2.path): 'p2newvalue',
484
def test_serialize(self):
485
User = self.classes.User
486
Address = self.classes.Address
487
umapper = inspect(self.classes.User)
488
amapper = inspect(self.classes.Address)
490
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper,
491
amapper.attrs.email_address))
492
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
493
p3 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
496
[(User, "addresses"), (Address, "email_address")]
500
[(User, "addresses"), (Address, None)]
504
[(User, "addresses")]
507
def test_deseralize(self):
508
User = self.classes.User
509
Address = self.classes.Address
510
umapper = inspect(self.classes.User)
511
amapper = inspect(self.classes.Address)
514
p1 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper,
515
amapper.attrs.email_address))
516
p2 = PathRegistry.coerce((umapper, umapper.attrs.addresses, amapper))
517
p3 = PathRegistry.coerce((umapper, umapper.attrs.addresses))
520
PathRegistry.deserialize([(User, "addresses"),
521
(Address, "email_address")]),
525
PathRegistry.deserialize([(User, "addresses"), (Address, None)]),
529
PathRegistry.deserialize([(User, "addresses")]),
533
from .inheritance import _poly_fixtures
534
class PathRegistryInhTest(_poly_fixtures._Polymorphic):
535
run_setup_mappers = 'once'
539
def test_plain(self):
540
Person = _poly_fixtures.Person
541
Engineer = _poly_fixtures.Engineer
542
pmapper = inspect(Person)
543
emapper = inspect(Engineer)
545
p1 = PathRegistry.coerce((pmapper, emapper.attrs.machines))
547
# given a mapper and an attribute on a subclass,
548
# the path converts what you get to be against that subclass
551
(emapper, emapper.attrs.machines)
554
def test_plain_compound(self):
555
Company = _poly_fixtures.Company
556
Person = _poly_fixtures.Person
557
Engineer = _poly_fixtures.Engineer
558
cmapper = inspect(Company)
559
pmapper = inspect(Person)
560
emapper = inspect(Engineer)
562
p1 = PathRegistry.coerce((cmapper, cmapper.attrs.employees,
563
pmapper, emapper.attrs.machines))
565
# given a mapper and an attribute on a subclass,
566
# the path converts what you get to be against that subclass
569
(cmapper, cmapper.attrs.employees, emapper, emapper.attrs.machines)
572
def test_plain_aliased(self):
573
Person = _poly_fixtures.Person
574
Engineer = _poly_fixtures.Engineer
575
emapper = inspect(Engineer)
577
p_alias = aliased(Person)
578
p_alias = inspect(p_alias)
580
p1 = PathRegistry.coerce((p_alias, emapper.attrs.machines))
581
# plain AliasedClass - the path keeps that AliasedClass directly
585
(p_alias, emapper.attrs.machines)
588
def test_plain_aliased_compound(self):
589
Company = _poly_fixtures.Company
590
Person = _poly_fixtures.Person
591
Engineer = _poly_fixtures.Engineer
592
cmapper = inspect(Company)
593
emapper = inspect(Engineer)
595
c_alias = aliased(Company)
596
p_alias = aliased(Person)
598
c_alias = inspect(c_alias)
599
p_alias = inspect(p_alias)
601
p1 = PathRegistry.coerce((c_alias, cmapper.attrs.employees,
602
p_alias, emapper.attrs.machines))
603
# plain AliasedClass - the path keeps that AliasedClass directly
607
(c_alias, cmapper.attrs.employees, p_alias, emapper.attrs.machines)
610
def test_with_poly_sub(self):
611
Person = _poly_fixtures.Person
612
Engineer = _poly_fixtures.Engineer
613
emapper = inspect(Engineer)
615
p_poly = with_polymorphic(Person, [Engineer])
616
e_poly = inspect(p_poly.Engineer)
617
p_poly = inspect(p_poly)
619
p1 = PathRegistry.coerce((p_poly, emapper.attrs.machines))
621
# polymorphic AliasedClass - the path uses _entity_for_mapper()
622
# to get the most specific sub-entity
625
(e_poly, emapper.attrs.machines)
628
def test_with_poly_base(self):
629
Person = _poly_fixtures.Person
630
Engineer = _poly_fixtures.Engineer
631
pmapper = inspect(Person)
632
emapper = inspect(Engineer)
634
p_poly = with_polymorphic(Person, [Engineer])
635
p_poly = inspect(p_poly)
637
# "name" is actually on Person, not Engineer
638
p1 = PathRegistry.coerce((p_poly, emapper.attrs.name))
640
# polymorphic AliasedClass - because "name" is on Person,
641
# we get Person, not Engineer
644
(p_poly, pmapper.attrs.name)
647
def test_with_poly_use_mapper(self):
648
Person = _poly_fixtures.Person
649
Engineer = _poly_fixtures.Engineer
650
emapper = inspect(Engineer)
652
p_poly = with_polymorphic(Person, [Engineer], _use_mapper_path=True)
653
p_poly = inspect(p_poly)
655
p1 = PathRegistry.coerce((p_poly, emapper.attrs.machines))
657
# polymorphic AliasedClass with the "use_mapper_path" flag -
658
# the AliasedClass acts just like the base mapper
661
(emapper, emapper.attrs.machines)