Hum,

in fact, 1 and 3 and also the idea to checkin Scons 2.3 in our current code (as 
well as all maintenance branches) are equivalent, and painful: We have many 
maintenance branches, and hundreds of tags that potentially may have to be 
checked out again and recompiled.

2 seems to be the only actual solution in order to keep all existing code 
working.

However, what would you think about such implementation which keeps compatible 
with current code:

- rename private attributes. example: abspath -> private_abspath
- for new code, use new interface. example: get_abspath() { return 
self.private_abspath }
- for old code, allow using the old private attribute thanks to __getattr__():


class Node:

    __slots__ = ('private_abspath')

    def __init__(self):
        self.private_abspath = None
    
    def get_abspath(self):
        self.private_abspath = "/a/path" # Lazy initialization
        return self.private_abspath
    
    def __getattr__(self, attr):
        if attr == "abspath":
            print "warning: abspath supported only for API consistency with 
peformance loss. Use get_abspath()" # in real class,this warning should only be 
printed once.
            return self.get_abspath()
            

n = Node()
print n.get_abspath()
print n.abspath

result:

/a/path
warning: abspath supported only for API consistency with peformance loss. Use 
get_abspath()
/a/path

Note: I always considered .path and .abspath as public API as they are 
documented and used in many examples in the documentation. Was that a wrong 
assumption?




> Le 2 mars 2015 à 09:30, Dirk Bächle <[email protected]> a écrit :
> 
> Alexandre,
> 
> On 02.03.2015 09:06, [email protected] wrote:
>> Hi Dirk,
>> 
>> About those new interfaces for accessing node attributes that may get 
>> initialized lazily, do I understand here the consequences properly?
>> 
>> - Using directly a_node.path or a_node.abspath *must* be replaced in all 
>> SConstructs/SConscripts by the new interfaces if we wan’t them to keep 
>> working properly
>> - This lets us with 2 solutions:
>>    1- Do these changes in all our product maintenance branches, and even 
>> each time we need to checkout again an old tag we want to compile again.
>>    2- Keep an old Scons 2.3 to build our old code, and change our build 
>> infrastructure to be able to have different SCons paths, so we can chose the 
>> proper one.
>> 
> 
> sorry, I forgot:
> 
>      3- Factor out all your direct accesses to Node internals into a custom 
> module/Builder, and then wrap it with a check for the SCons version. For 
> 2.3.x and smaller, you access Node attributes as before, and for the newer 
> versions you then branch to using the getter methods.
> 
> This is pretty much what the compat layer would do, which I mentioned in my 
> last reply.
> 
> Best regards,
> 
> Dirk
> 
> 
> _______________________________________________
> Scons-dev mailing list
> [email protected]
> https://pairlist2.pair.net/mailman/listinfo/scons-dev

_______________________________________________
Scons-dev mailing list
[email protected]
https://pairlist2.pair.net/mailman/listinfo/scons-dev

Reply via email to