@@ -386,6 +386,7 @@ def i_will():
386386
387387 func = i_will ().abc
388388 assert func .will == 'abc'
389+ assert getattr (func , 'will' ) == 'abc'
389390
390391def test_will_deep ():
391392
@@ -427,21 +428,31 @@ def do(self):
427428 assert c .will == 'do'
428429 assert result == 'I will do something'
429430
430- # issue #18
431+
431432def test_will_method ():
432433 class AwesomeClass :
433434 def __init__ (self ):
434- self .will = None
435+ self .wills = [None ]
436+
437+ def __call__ (self , * _ ):
438+ return self
439+
440+ myself = __call__
441+ __getattr__ = __call__
435442
436443 def permit (self , * _ ):
437- self .will = will (raise_exc = False )
438- if self .will == 'do' :
439- # let self handle do
440- return self
441- raise AttributeError ('Should do something with AwesomeClass object' )
444+ self .wills .append (will (raise_exc = False ))
445+
446+ if self .wills [- 1 ] is None :
447+ raise AttributeError (
448+ 'Should do something with AwesomeClass object'
449+ )
450+
451+ # let self handle do
452+ return self
442453
443454 def do (self ):
444- if self .will != 'do' :
455+ if self .wills [ - 1 ] != 'do' :
445456 raise AttributeError ("You don't have permission to do" )
446457 return 'I am doing!'
447458
@@ -456,8 +467,31 @@ def do(self):
456467 awesome .permit ()
457468 assert str (exc .value ) == 'Should do something with AwesomeClass object'
458469
470+ # clear wills
471+ awesome = AwesomeClass ()
459472 ret = awesome .permit ().do ()
460473 assert ret == 'I am doing!'
474+ assert awesome .wills == [None , 'do' ]
475+
476+ awesome = AwesomeClass ()
477+ ret = awesome .myself ().permit ().do ()
478+ assert ret == 'I am doing!'
479+ assert awesome .wills == [None , 'do' ]
480+
481+ awesome = AwesomeClass ()
482+ ret = awesome ().permit ().do ()
483+ assert ret == 'I am doing!'
484+ assert awesome .wills == [None , 'do' ]
485+
486+ awesome = AwesomeClass ()
487+ ret = awesome .attr .permit ().do ()
488+ assert ret == 'I am doing!'
489+ assert awesome .wills == [None , 'do' ]
490+
491+ awesome = AwesomeClass ()
492+ ret = awesome .permit ().permit ().do ()
493+ assert ret == 'I am doing!'
494+ assert awesome .wills == [None , 'permit' , 'do' ]
461495
462496 with pytest .raises (AttributeError ) as exc :
463497 print (awesome [2 ])
@@ -466,6 +500,37 @@ def do(self):
466500 ret = awesome [2 ].do ()
467501 assert ret == 'I am doing!'
468502
503+ def test_will_decorated ():
504+
505+ def return_self (func ):
506+ def wrapper (self , * args , ** kwargs ):
507+ func (self , * args , ** kwargs )
508+ return self
509+
510+ return wrapper
511+
512+ class Foo :
513+
514+ def __init__ (self ):
515+ self .will = None
516+
517+ def get_will (self ):
518+ self .will = will (raise_exc = False )
519+ return self
520+
521+ @return_self
522+ def get_will_decor (self ):
523+ self .will = will (2 , raise_exc = False )
524+
525+ def __getattr__ (self , name ):
526+ return self .will
527+
528+ x = Foo ().get_will ().x
529+ assert x == 'x'
530+
531+ x = Foo ().get_will_decor ().x
532+ assert x == 'x'
533+
469534
470535def test_will_fail ():
471536
0 commit comments