mirror of
https://gitlab.com/scemama/irpf90.git
synced 2024-12-22 12:23:32 +01:00
Move lib
This commit is contained in:
parent
8a31b6302c
commit
a4a6d7ceaa
0
src/lib/__init__.py
Normal file
0
src/lib/__init__.py
Normal file
BIN
src/lib/__init__.pyc
Normal file
BIN
src/lib/__init__.pyc
Normal file
Binary file not shown.
10
src/lib/manager.py
Normal file
10
src/lib/manager.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
try:
|
||||||
|
import irpy
|
||||||
|
except:
|
||||||
|
import static_irpy as irpy
|
||||||
|
|
||||||
|
try:
|
||||||
|
import ashes
|
||||||
|
except:
|
||||||
|
import static_ashes as ashes
|
||||||
|
|
BIN
src/lib/manager.pyc
Normal file
BIN
src/lib/manager.pyc
Normal file
Binary file not shown.
2602
src/lib/static_ashes.py
Normal file
2602
src/lib/static_ashes.py
Normal file
File diff suppressed because it is too large
Load Diff
BIN
src/lib/static_ashes.pyc
Normal file
BIN
src/lib/static_ashes.pyc
Normal file
Binary file not shown.
161
src/lib/static_irpy.py
Normal file
161
src/lib/static_irpy.py
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
d_path = defaultdict(list)
|
||||||
|
d_last_caller = defaultdict(lambda: None)
|
||||||
|
|
||||||
|
def genealogy(obj, _node, direction,degree_max=100):
|
||||||
|
"""Return the genealogy of a _node.
|
||||||
|
Direction is $parents or $children, recurse accordingly"""
|
||||||
|
|
||||||
|
def sap(_node, direction, visited=set(), degree=0):
|
||||||
|
|
||||||
|
visited.add(_node)
|
||||||
|
try:
|
||||||
|
s = getattr(obj, "{0}_{1}".format(_node, direction))
|
||||||
|
except AttributeError:
|
||||||
|
s = set()
|
||||||
|
|
||||||
|
for next_ in s - visited:
|
||||||
|
|
||||||
|
if degree < degree_max:
|
||||||
|
sap(next_, direction, visited, degree+1)
|
||||||
|
|
||||||
|
return visited
|
||||||
|
|
||||||
|
s = sap(_node, direction) - set([_node])
|
||||||
|
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
|
def addattr(obj, name, value):
|
||||||
|
try:
|
||||||
|
s = getattr(obj, name)
|
||||||
|
except AttributeError:
|
||||||
|
setattr(obj, name, set([value]))
|
||||||
|
else:
|
||||||
|
setattr(obj, name, s | set([value]))
|
||||||
|
|
||||||
|
def removeattr(obj, name, value):
|
||||||
|
try:
|
||||||
|
s = getattr(obj, name)
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
setattr(obj, name, s - set([value]))
|
||||||
|
|
||||||
|
|
||||||
|
# _
|
||||||
|
# | \ _ _ _ ._ _. _|_ _ ._
|
||||||
|
# |_/ (/_ (_ (_) | (_| |_ (_) |
|
||||||
|
#
|
||||||
|
class lazy_property(object):
|
||||||
|
"""
|
||||||
|
My little Property
|
||||||
|
My little Property
|
||||||
|
My little Property... friend
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, provider, init_node=False, immutable=True):
|
||||||
|
"""Provider: If a function who will be used to compute the node
|
||||||
|
init_node: If the name of the node
|
||||||
|
immutable: If immutable is set you cannot set the node"""
|
||||||
|
|
||||||
|
self.provider = provider
|
||||||
|
self.init_node = init_node
|
||||||
|
self.immutable = immutable
|
||||||
|
|
||||||
|
if not self.init_node:
|
||||||
|
name = provider.__name__
|
||||||
|
else:
|
||||||
|
name = self.init_node
|
||||||
|
|
||||||
|
#Kind of human readable identifier
|
||||||
|
self._node = "_%s_%s" % (name, id(provider))
|
||||||
|
|
||||||
|
def __get__(self, obj, objtype):
|
||||||
|
"Get the value of the node and handle the genealogy"
|
||||||
|
|
||||||
|
_node = self._node
|
||||||
|
|
||||||
|
if d_path[obj]:
|
||||||
|
_caller = d_path[obj][-1]
|
||||||
|
if _caller != d_last_caller[obj]:
|
||||||
|
addattr(obj, "%s_parents" % _node, _caller)
|
||||||
|
addattr(obj, "%s_children" % _caller, _node)
|
||||||
|
d_last_caller[obj] = _caller
|
||||||
|
|
||||||
|
#Wanted: value. Cached or Computed
|
||||||
|
try:
|
||||||
|
value = getattr(obj, _node)
|
||||||
|
except AttributeError:
|
||||||
|
|
||||||
|
d_path[obj].append(_node)
|
||||||
|
|
||||||
|
value = self.provider(obj)
|
||||||
|
setattr(obj, _node, value)
|
||||||
|
|
||||||
|
d_path[obj].pop()
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def __set__(self, obj, value):
|
||||||
|
"""Set the value of the node
|
||||||
|
But wait, init_node are "gradual typed" variable! Youpi!
|
||||||
|
Idea borrowed from the-worst-programming-language-ever (http://bit.ly/13tc6XW)
|
||||||
|
"""
|
||||||
|
|
||||||
|
_node = self._node
|
||||||
|
|
||||||
|
if not self.init_node:
|
||||||
|
|
||||||
|
if self.immutable:
|
||||||
|
raise AttributeError("Immutable Node {0}".format(self._node))
|
||||||
|
|
||||||
|
#Set the new value
|
||||||
|
setattr(obj, _node, value)
|
||||||
|
|
||||||
|
#Node ancestor need to be recompute is asked
|
||||||
|
for _parent in genealogy(obj, _node, "parents"):
|
||||||
|
if hasattr(obj, _parent): delattr(obj, _parent)
|
||||||
|
|
||||||
|
#Node abandoned her children,
|
||||||
|
for _child in genealogy(obj, _node, "children",degree_max=1):
|
||||||
|
removeattr(obj, "%s_parents" % _child, _node)
|
||||||
|
|
||||||
|
#Indeed node is now a leaf
|
||||||
|
setattr(obj, "%s_children" % _node, set())
|
||||||
|
|
||||||
|
else:
|
||||||
|
setattr(obj, _node, value)
|
||||||
|
self.init_node = False
|
||||||
|
|
||||||
|
|
||||||
|
def lazy_property_mutable(provider):
|
||||||
|
"Return a lazy_property mutable"
|
||||||
|
return lazy_property(provider=provider, immutable=False)
|
||||||
|
|
||||||
|
|
||||||
|
def lazy_property_leaves(mutables=(), immutables=()):
|
||||||
|
"Set to properties for the __init__ method"
|
||||||
|
|
||||||
|
def leaf_decorator(func):
|
||||||
|
def func_wrapper(self, *args, **kwargs):
|
||||||
|
|
||||||
|
for node in set(immutables) | set(mutables):
|
||||||
|
|
||||||
|
def provider(self):
|
||||||
|
return getattr(self, "_%s" % node)
|
||||||
|
|
||||||
|
p = lazy_property(provider=provider,
|
||||||
|
init_node=node,
|
||||||
|
immutable=node in immutables)
|
||||||
|
|
||||||
|
#If this ugly? Yeah... Is this an issue? I don't really know
|
||||||
|
setattr(self.__class__, node, p)
|
||||||
|
|
||||||
|
return func(self, *args, **kwargs)
|
||||||
|
|
||||||
|
return func_wrapper
|
||||||
|
|
||||||
|
return leaf_decorator
|
Loading…
Reference in New Issue
Block a user