Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 13 additions & 21 deletions truths/truths.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,48 +20,40 @@
import re


class Gob(object):
pass


class Truths(object):
def __init__(self, base=None, phrases=None, ints=True):
if not base:
def __init__(self, bases=None, phrases=None, ints=True):
if not bases:
raise Exception('Base items are required')
self.base = base
self.bases = bases
self.phrases = phrases or []
self.ints = ints

# generate the sets of booleans for the bases
self.base_conditions = list(itertools.product([False, True],
repeat=len(base)))
repeat=len(bases)))

# regex to match whole words defined in self.bases
# used to add object context to variables in self.phrases
self.p = re.compile(r'(?<!\w)(' + '|'.join(self.base) + ')(?!\w)')
self.p = re.compile(r'(?<!\w)(' + '|'.join(self.bases) + ')(?!\w)')

def calculate(self, *args):
# store bases in an object context
g = Gob()
for a, b in zip(self.base, args):
setattr(g, a, b)

# add object context to any base variables in self.phrases
# then evaluate each
bools = dict(zip(self.bases, args))
# substitute bases with boolean values in self.phrases then evaluate
# each phrase
eval_phrases = []
for item in self.phrases:
item = self.p.sub(r'g.\1', item)
eval_phrases.append(eval(item))
for phrase in self.phrases:
phrase = self.p.sub(lambda match: str(bools[match.group(0)]), phrase)
eval_phrases.append(eval(phrase))

# add the bases and evaluated phrases to create a single row
row = [getattr(g, b) for b in self.base] + eval_phrases
row = [val for key, val in bools.items()] + eval_phrases
if self.ints:
return [int(c) for c in row]
else:
return row

def __str__(self):
t = PrettyTable(self.base + self.phrases)
t = PrettyTable(self.bases + self.phrases)
for conditions_set in self.base_conditions:
t.add_row(self.calculate(*conditions_set))
return str(t)