Skip to content

Commit

Permalink
improve tree
Browse files Browse the repository at this point in the history
  • Loading branch information
ypankovych committed Jun 30, 2021
1 parent 187254f commit f68f2cd
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 10 deletions.
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,13 @@ Now, lets build an actual tree:
```python
>>> tree = chain.to_tree()
>>> print(tree)
InvertedUnion
└── UnionOr
├── UnionAnd
OR NOT
└── OR
├── AND
│ ├── Predicate(validate_name_lower)
│ └── Predicate(validate_name_length)
└── UnionAnd
├── InvertedPredicate(validate_name_lower)
└── AND
├── NOT Predicate(validate_name_lower)
└── Predicate(validate_name_length)
```
You can convert it into a picture as well:
Expand Down
29 changes: 25 additions & 4 deletions chainee/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def __init__(self):

def __call__(self, node: Node):
if node not in self._nodes:
node.name = f"{node.name}-{len(self._nodes)}"
node.name = f"{node.name} ({len(self._nodes)})"
self._nodes.append(node)
return node.name

Expand All @@ -37,6 +37,8 @@ class BasePredicate:
description: str = field(init=False)

def __post_init__(self):
if not callable(self.func):
raise TypeError("Predicate function should be a callable object")
self.description = self.func.__doc__

def __or__(self, other):
Expand All @@ -49,7 +51,7 @@ def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)

def _to_tree(self, root):
return Node(f"{type(self).__name__}({self.func.__name__})", parent=root)
return Node(get_predicate_verbose_name(self), parent=root)


class InvertedPredicate(BasePredicate):
Expand Down Expand Up @@ -103,7 +105,7 @@ class Union(BaseUnion):
rhs: typing.Union[BasePredicate, BaseUnion]

def _to_tree(self, parent=None):
root = Node(type(self).__name__, parent=parent)
root = Node(get_union_verbose_name(self), parent=parent)
self.rhs._to_tree(root)
self.lhs._to_tree(root)
return root
Expand All @@ -120,7 +122,7 @@ def __call__(self, *args, **kwargs):
return not self.union(*args, **kwargs)

def _to_tree(self, parent=None):
root = Node(type(self).__name__, parent=parent)
root = Node(get_union_verbose_name(self), parent=parent)
self.union._to_tree(root)
return root

Expand All @@ -135,3 +137,22 @@ class UnionOr(Union):

def __call__(self, *args, **kwargs):
return self.lhs(*args, **kwargs) or self.rhs(*args, **kwargs)


def get_union_verbose_name(union):
if isinstance(union, UnionOr):
return "OR"
elif isinstance(union, UnionAnd):
return "AND"
elif isinstance(union, InvertedUnion):
if isinstance(union.union, UnionOr):
return "OR NOT"
else:
return "AND NOT"


def get_predicate_verbose_name(predicate):
name = f"Predicate({predicate.func.__name__})"
if isinstance(predicate, InvertedPredicate):
name = "NOT " + name
return name
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from distutils.core import setup

version = "1.0"
version = "1.1"
setup(
name='chainee',
packages=['chainee'],
Expand Down

0 comments on commit f68f2cd

Please sign in to comment.